我正在看一个关于原子操作和之前发生过的关系的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];
这是我的理解(如果我错了请纠正我):
load
操作在 thread1 的store
操作之前,则tmp
将为data[0]
}。store
操作操作在 thread2 的load
操作之前,则tmp
将为{{1}因为 thread1 的data[ 1 ]
将确保所有先前对其他内存位置的写入对 thread2 可见,即使store(1,memory_order_release)
不是计算上的 - 依赖于索引。有人可以澄清他们所说的错误吗?
答案 0 :(得分:1)
使用release/consume
,在store(release)
之前写入变量
仅当匹配load(consume)
时才保证可见,并且仅当时才显示
变量取决于中使用的变量
store(release)
- load(consume)
对。
使用int
文字索引data[]
此依赖关系已被破坏,
因此,data[]
之后的写入不保证可见
a.load(consume)
。