を変数を書き、読んで、私は自分自身にこの1つの質問をしてきましたかC++は、異なるスレッドから未定義の動作
スレッドの整数を増やし、別の整数の中の整数を読み込む最小限の例を考えてみましょう。
void thread1()
{
x++;
}
void thread2()
{
if (x == 5)
{
//doSomething
}
}
私はほかの操作はアトミックではないことを理解し、最初のスレッドが加算動作の途中である一方、それゆえ私は2番目のスレッドからの読み出しを行うことができますが、私はかなりよく分からないものがありますの。
x
は、加算操作全体が完了してからこの新しい値が割り当てられるまで値を保持するか、x
が中間状態であるため、未定義の動作が発生します。
最初の理論が適用される場合、書いている間にx
から読み取ると、加算前の値が返され、それほど問題にはなりません。
二説が本当であるならば、誰かが(多分一例で?)加算演算のプロセスであり、なぜそれが未定義の動作がどうなるかをより詳細に説明できる
おかげ
あなたは[this](http://preshing.com/20130618/atomic-vs-non-atomic-operations/)を読むべきです – WhiZTiM
これはUBです。スレッド2は 'x'の値が変わるのを保証する保証はありません。さらに悪いことに、コンパイラは、 'x'が決して変更されず、' if'テストを取り除く理由を考えるかもしれません。 'std :: atomic <*>'について読んでください。 –
ちょうど好奇心のために:どのようにコンパイラが別のスレッドで実行され、ifを削除することを知っていますか? – Aik