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. 如果thread2 的load操作先于thread1store的操作, 则将tmpdata[0]
  2. 如果thread1store的操作先于thread2load的操作,那么将是因为thread1确保之前对其他内存位置的所有写入对thread2都是可见的,即使在计算上不依赖于索引。tmpdata[ 1 ]store(1,memory_order_release)data[]

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

4

1 回答 1

1

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

通过使用int文字来索引data[]this 依赖关系已被破坏,因此data[]不能保证在 a.load(consume).

于 2013-05-21T10:51:59.313 回答