アトミック操作と事前発生の関係に関する 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];
これが私が理解したことです(間違っている場合は修正してください):
- スレッド
load2による操作がスレッド 1storeによる操作よりも前にある場合は、 に なります。tmpdata[0] - thread1
storeによる操作 operation がthread2による操作よりも前にある場合、それは、 index に計算上依存していなくても、別のメモリ位置への以前のすべての書き込みが thread2 に確実に表示されるためです。loadtmpdata[ 1 ]store(1,memory_order_release)data[]
誰かが彼らが話しているエラーを明確にしてもらえますか?