我正在看一个关于原子操作和事前发生关系的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
这是我的理解(如果我错了,请纠正我):
load
操作在线程1的store
操作之前,则tmp
将为data[0]
。 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/