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

这是我的理解(如果我错了,请纠正我):
  • 如果线程2的load操作在线程1的store操作之前,则tmp将为data[0]
  • 如果线程1的store操作操作在线程2的load操作之前,则tmp将是data[ 1 ],因为即使store(1,memory_order_release)不依赖于计算,线程1的data[]仍可确保线程2可以看到对其他内存位置的所有先前写入。

  • 有人可以澄清他们正在谈论的错误吗?

    最佳答案

    使用release/consume,在store(release)之前写入变量
    仅在以下情况下,才保证在匹配的load(consume)上可见:
    变量取决于在store(release)-一对load(consume)

    通过使用int文字对data[]进行索引,此依赖关系已被打破,
    因此,对data[]的写入不能保证在a.load(consume)

    关于c++ - boost memory_order_consume示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16667246/

    10-11 07:42