如何解决C++ 中的原子操作和可见性
考虑以下代码:
static std::atomic<int> x;
// Thread 1
x.store(7,std::memory_order_relaxed);
// Thread 2
x.load(std::memory_order_relaxed);
进一步假设线程 2 执行了 load
几个周期 线程 1 执行了 store
。
是否保证线程 2 会在所有硬件平台上读取值 7
?换句话说,在线程 1 执行了 store
之后,是否可以保证值 7 将立即对线程可见,稍后再轻松加载相同的变量?
解决方法
是的,它将是可见的。 关于放松的记忆顺序以及它们与更强的记忆顺序相比做什么,这已经成为一个普遍的问题。
内存顺序强于内存顺序宽松有以下两件事:
- 同步非原子数据
- 防止在同一线程中重新排序指令
不同的顺序保证了不同的同步策略(只读、只写、读和写)和不同的重排序预防(只有在指令之前执行的,只有在指令之后执行的,或者两者都有)。内存顺序放宽并不能保证其中任何一个,它只保证原子变量跨线程可见。
在您的示例中,除了一个线程中的存储和另一个线程中的加载之外,没有其他指令。另外,没有非原子内存可以跨线程同步,唯一的内存已经是原子的了。
所以没有必要使用比memory_order_relaxed
更重的东西。上面的代码片段是有效的,会产生想要的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。