[英]example about memory ordering in c++
考虑以下示例:
-Thread 1-
y.store (20, memory_order_relaxed);
x.store (10, memory_order_release);
-Thread 2-
if (x.load(memory_order_acquire) == 10) {
assert (y.load(memory_order_relaxed) == 20)
y.store (10, memory_order_release)
}
-Thread 3-
if (y.load(memory_order_acquire) == 10)
assert (x.load(memory_order_relaxed) == 10)
在这个例子中,第二个assert
将触发(我是否正确?)。 是因为在y.store (10, memory_order_release)
之前的线程2中没有存储到x
?
(在cppreference.com中,他们说这个关于release
句子:“具有此内存顺序的存储操作执行释放操作:先前对其他内存位置的写入对于在同一位置执行消耗或获取的线程变得可见。”)
我可以更改商店为了y
在线程2从release
到sec/cst
来解决这个问题?
您的示例未完成,因为您尚未指定x和y的初始值。 但是我们假设启动所有线程的线程都已初始化为0。
然后,如果线程2对y进行存储,它必须从线程1的存储读取到x并与之同步。 如果线程3的加载从y读取线程2的存储到y,它也必须同步。 因此,线程1中的x存储必须在线程3中的加载之前发生,并且必须在初始化存储到x之后发生。 因此,线程3的x.load必须得到值10.在没有消耗之前发生的事情是传递的。
我建议在这些示例中使用CDSChecker来查看可能的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.