标记为 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);
当线程 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节中也有这方面的说明。
相关文章:
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 求最大元素位置的分治算法
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 如何将元素添加到向量的字符串位置
- 如何选择在 csv 文件中输出的位置
- 无法打开 fstream C++文件,即使它与 .cpp 位于同一位置
- 如何在特定位置追加 json 文件
- 标记为 std::memory_order_seq_cst 的单个原子操作是否会在所有位置触发顺序一致性?