6

私はこれを同僚のコードで呼び出されることのない部分で見ました:

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

vol_flagヘッダーファイルで宣言されていますが、変更されることはありません。これにより、プログラムが無限ループでハングすることになりますか?それから抜け出す方法はありますか?

4

1 に答える 1

16

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

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

(Java とは異なり) volatileC/C++ では、事前発生関係を確立せず、揮発性アクセス全体でのメモリ参照の順序付けや可視性を保証しないことに注意してください。さらに、変数参照の原子性は保証されません。したがって、スレッド間の通信用のツールではありません。詳しくはこちらをご覧ください。

于 2012-05-11T06:58:22.423 に答える