2

アトミック操作と事前発生の関係に関する 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];

ブーストの例

これが私が理解したことです(間違っている場合は修正してください):

  1. スレッドload2による操作がスレッド 1storeによる操作よりも前にある場合は、 に なります。tmpdata[0]
  2. thread1storeによる操作 operation がthread2による操作よりも前にある場合、それは、 index に計算上依存していなくても、別のメモリ位置への以前のすべての書き込みが thread2 に確実に表示れるためです。loadtmpdata[ 1 ]store(1,memory_order_release)data[]

誰かが彼らが話しているエラーを明確にしてもらえますか?

4

1 に答える 1