Boost memory_order_consume示例

时间:2013-05-21 10:00:31

标签: c++ boost c++11 atomic

我正在看一个关于原子操作和之前发生过的关系的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];

Boost Example

这是我的理解(如果我错了请纠正我):

  1. 如果 thread2 load操作在 thread1 store操作之前,则tmp将为data[0] }。
  2. 如果 thread1 store操作操作在 thread2 load操作之前,则tmp将为{{1}因为 thread1 data[ 1 ]将确保所有先前对其他内存位置的写入对 thread2 可见,即使store(1,memory_order_release)不是计算上的 - 依赖于索引。
  3. 有人可以澄清他们所说的错误吗?

1 个答案:

答案 0 :(得分:1)

使用release/consume,在store(release)之前写入变量 仅当匹配load(consume) 时才保证可见,并且仅当时才显示 变量取决于中使用的变量 store(release) - load(consume)对。

使用int文字索引data[]此依赖关系已被破坏, 因此,data[]之后的写入不保证可见 a.load(consume)