2012-05-11 10 views
6

私は同僚のコードで呼ばれることは決してありません一部でこれを見た:while(!volatile);とは何ですか?行う?

volatile unsigned char vol_flag = 0; 
// ... 
while(!vol_flag); 

vol_flagは、ヘッダファイルで宣言されていますが、変更されることはありません。私は、これが無限ループにぶら下がっているプログラムにつながると訂正していますか?そこから道がありますか?

+2

マルチスレッドコードでスピンロックが不十分なように見えます。 –

+1

おそらくそれはデバッグ用ですか? – animaonline

+2

このようなコードは通常、マイクロコントローラ用のプログラムにあります。 – alexander

答えて

16

通常、このようなコードは、vol_flagがある時点での外部でに変更されることが予想されることを示します。ここで、は外部でであり、異なるスレッド、割り込みハンドラ、ハードウェア(メモリマップIOの場合)などを意味することがあります。このループは、フラグを変更する外部イベントを効果的に待機します。

volatileキーワードは、コードから明らかなものを想定することが安全でないという事実をプログラマが表現する方法です。つまり、ループ内でフラグが変更されないということです。したがって、コンパイラがコードの意図を損なう可能性のある最適化を行わないようにします。代わりに、コンパイラは、フラグの値をフェッチするためにメモリ参照を行うように強制されます。

注C/C++での(Javaの場合とは異なり)volatileことは関係する前に、起こり、揮発性のアクセス間でのメモリ参照の任意の順序付けや可視性を保証するものではありません確立されません。さらに、可変参照のアトミック性を保証するものでもありません。したがって、スレッド間の通信のためのツールではありません。詳細については、thisを参照してください。

関連する問題