繁体   English   中英

标记为 std::memory_order_seq_cst 的单个原子操作是否会在任何地方触发顺序一致性?

[英]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 == 1b == 0 ,而线程 4 观察a == 0b == 1 y不使用任何memory_order_seq_cst操作访问,也不使用x存储进行排序。 因此,没有单一的线程间排序来确定xy上的存储发生的顺序。

在 C++17 标准最终草案的[atomics.order]/8部分中还有一个说明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM