アトミック操作と事前発生の関係に関する Boost の例を見ていましたが、少し混乱しています。「解放して消費する前に起こる」セクションでは、次の例が間違っていると言っていますが、私には見えません。
atomic<int> a(0);
complex_data_structure data[2];
スレッド1:
data[1] = ...; /* A */
a.store(1, memory_order_release);
スレッド 2:
int index = a.load(memory_order_consume);
complex_data_structure tmp;
if (index == 0)
tmp = data[0];
else
tmp = data[1];
これが私が理解したことです(間違っている場合は修正してください):
- スレッド
load
2による操作がスレッド 1store
による操作よりも前にある場合は、 に なります。tmp
data[0]
- thread1
store
による操作 operation がthread2による操作よりも前にある場合、それは、 index に計算上依存していなくても、別のメモリ位置への以前のすべての書き込みが thread2 に確実に表示されるためです。load
tmp
data[ 1 ]
store(1,memory_order_release)
data[]
誰かが彼らが話しているエラーを明確にしてもらえますか?