[英]Which value does atomic read operation with memory_order_seq_cst read in this situation?
[英]Does a single atomic operation marked as std::memory_order_seq_cst trigger sequential consistency everywhere?
顺序一致性在所有线程上强加所有原子操作的全局顺序。 据我所知,这意味着线程将按照源代码中指定的方式运行,无需重新排序。 所有线程将按顺序执行它们的操作。
直观地说,它看起来像是在多线程应用程序的main()
函数中设置的一个选项或标志,类似于“我希望我的所有线程都遵循顺序一致性”。 当然,C++ 中没有这样的东西。
所以这是我的问题:代码中任何地方是否仅存在单个x.load(std::memory_order_seq_cst)
或x.store(y, std::memory_order_seq_cst)
指令足以强制所有线程,即使是与x
无关的线程以顺序一致的方式表现?
不, memory_order_seq_cst
仅保证所有memory_order_seq_cst
原子访问/围栏的总顺序,请参阅 C++17 标准最终草案的[atomics.order]/3 。 它不会将该要求强加于其他内存访问,即使是具有较弱内存顺序的原子访问。
例如,如果对于两个原子变量std::atomic<int> x{0}, y{0};
初始化为0
,线程 1 执行
x.store(1, std::memory_order_seq_cst);
线程 2 执行
y.store(1, std::memory_order_relaxed);
while 线程 3 和 4 执行
auto a = x.load(std::memory_order_relaxed);
auto b = y.load(std::memory_order_relaxed);
然后线程 3 可以例如观察a == 1
和b == 0
,而线程 4 观察a == 0
和b == 1
。 y
不使用任何memory_order_seq_cst
操作访问,也不使用x
存储进行排序。 因此,没有单一的线程间排序来确定x
和y
上的存储发生的顺序。
在 C++17 标准最终草案的[atomics.order]/8部分中还有一个说明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.