私は2つのスレッドからアクセスされる変数int foo
を持っています。私は競合状態の問題(アクセスはミューテックスによって保護されており、すべての操作はアトミックであるか、競合状態から保護するための他の方法であれ)がないと仮定すると、(登録名の不足のために)ここで、コンパイラは変数が間に書き込まれず二度読まれている場合、それは同じ値であると仮定してもよい、などのように離れたものを「最適化する」ことがあります。スレッド間で変数を同期させるための `volatile`
while(foo) { // <-may be optimized to if(foo) while(1)
do-something-that-doesn't-involve-foo;
}
または
if(foo) // becomes something like (my assembly is very rusty): mov ebx, [foo]; cmp ebx, 0; jz label;
do-something-that-doesn't-involve-foo;
do-something-else-that-doesn't-involve-foo;
if(foo) // <-may be optimized to jz label2;
do-something;
foo
としてvolatile
と表示されていますか?あるスレッドからの変更が他のスレッドに到達することが保証されていますか?
そうでない場合は、これを行うには他にどのような方法がありますか?私はLinux/Windows(おそらく別々のソリューション)、C++ 11用のソリューションが必要です。
私は、スレッドのためにvolatileをもう使用しないと言っている標準から引用符を見たことを思い出しました.C++では、私はそれを見つけようとします – aaronman
http:// stackoverflow。com/questions/4557979/when-to-use-volatile-with-multi-threading –
ここでの問題は「競合状態の問題がないと仮定します」です。これは** ENORMOUS **の前提です。 –