我正在查看有关原子操作和发生前关系的 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];
这是我的理解(如果我错了,请纠正我):
- 如果thread2 的
load
操作先于thread1store
的操作, 则将tmp
是data[0]
。 - 如果thread1
store
的操作先于thread2load
的操作,那么将是因为thread1将确保之前对其他内存位置的所有写入对thread2都是可见的,即使在计算上不依赖于索引。tmp
data[ 1 ]
store(1,memory_order_release)
data[]
有人可以澄清他们正在谈论的错误吗?