首页 > 后端开发 > C++ > 正文

为什么 `std::atomic` 的存储使用 XCHG 来实现 x86 上的顺序一致性?

Mary-Kate Olsen
发布: 2024-11-23 14:52:20
原创
679 人浏览过

Why does `std::atomic`'s store use XCHG for sequential consistency on x86?

为什么 std::atomic 的存储采用 XCHG 来实现顺序一致性

在 x86 和 x86_64 架构的 std::atomic 上下文中,具有顺序一致性的存储操作 (std::memory_order_seq_cst) 使用 XCHG 而不是使用内存屏障作为实现顺序释放语义的技术的简单存储。

顺序一致性和 xchg

顺序一致性规定所有内存操作似乎都以某种方式执行连续顺序,并且该顺序对于所有线程都是相同的。 XCHG 是一种以原子方式交换两个操作数的值的 x86 指令,本质上满足了这种顺序一致性要求。通过使用 XCHG 执行写入操作,std::atomic 确保存储在执行顺序的特定点对所有线程全局可见,从而防止后续操作重新排序。

mov- store mfence 与 XCHG

虽然简单的 mov-store 后跟内存栅栏(例如 mfence)理论上可以提供释放从语义上来说,它对于顺序释放存储操作来说是不够的。 MFENCE 是一种建立内存屏障的内存栅栏指令,可确保之前的写入操作在继续之前提交到内存。但是,它不会阻止后续加载操作在发布存储之前重新排序。

性能注意事项

顺序发布的 mov-store mfence 和 XCHG 之间的选择存储操作涉及性能权衡。

  • 在某些 CPU 上(例如 Intel Skylake),XCHG 比 mov-store mfence 更高效,特别是当周围没有需要与原子操作同步的依赖代码时。
  • 在其他 CPU 上,mov-store mfence 可能更适合高-吞吐量场景或周围代码可以与原子操作重叠执行时。

实现详细信息

在实践中,std::atomic 具有顺序一致性的存储的具体实现因编译器和硬件架构而异。

  • GCC/Clang: 最初使用 mov-store mfence 但最近改用 XCHG 进行 seq-cst
  • Intel 编译器: 将 XCHG 用于 seq-cst 存储。
  • Microsoft Visual C : 也将 XCHG 用于 seq-cst 存储。

隐式获取栅栏

x86 存储具有隐式获取栅栏的说法是不正确的。 x86 上的存储具有释放语义,而不是获取语义。获取语​​义通常使用内存屏障(例如 mfence)或带有 std::memory_order_acquire 语义的原子读取操作来强制执行。

以上是为什么 `std::atomic` 的存储使用 XCHG 来实现 x86 上的顺序一致性?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板