首页 > 后端开发 > C++ > 为什么 `std::atomic` 使用 XCHG 来确保存储中的顺序一致性?

为什么 `std::atomic` 使用 XCHG 来确保存储中的顺序一致性?

Patricia Arquette
发布: 2024-11-24 01:39:09
原创
352 人浏览过

Why Does `std::atomic` Use XCHG to Ensure Sequential Consistency in Stores?

XCHG 在确保 std::atomic 存储中的顺序一致性方面的作用

虽然使用常规存储然后进行读取似乎很直观/write 内存屏障以实现顺序一致性,std::atomic 的存储以顺序一致性 (seq_cst) 顺序代替使用 XCHG。这种方法通过 XCHG 在 x86 和 x86_64 架构中的具体特征得到了证明。

原子 RMW 和完整内存屏障

在 x86 架构上,原子读取-修改-写入(RMW) 操作(例如 XCHG)本质上充当完整内存屏障。 XCHG 上的隐式锁定前缀强制执行全局顺序,确保其执行的加载和存储操作不能通过缓冲或加载重新排序来分开。

顺序一致性与顺序发布

x86 上的普通存储操作具有释放语义,这允许它们对后续操作(包括获取加载)进行重新排序。为了强制执行顺序一致性,需要顺序释放屏障,而不是单独的释放屏障。

性能注意事项

在 MFENCE 和 XCHG 之间进行选择以实现 seq_cst 存储涉及性能权衡。虽然 MFENCE 会阻止 Intel Skylake 及后续架构上的乱序执行,但 XCHG 不会。这种差异可能会影响周围的代码执行。其他因素,例如缓存状态和线程争用,也可能会影响性能。

编译器和内核建议

最新版本的 GCC 和现代编译器更喜欢 XCHG 而不是 MFENCE seq_cst 在大多数平台上存储。 Linux 内核使用 XCHG 进行原子 seq_cst 存储,同时使用 XCHG 和 MFENCE 来实现不同类型的内存屏障。

x86 中的隐式内存屏障

该语句暗示x86 和 x86_64 存储拥有隐式获取栅栏的说法是不正确的。这些架构上的存储默认具有发布语义。为了获取语义,必须显式指定获取操作。

结论

在 std::atomic 的 seq_cst 存储中使用 XCHG 可以保证 x86 和 x86_64 平台上的顺序一致性通过利用 RMW 操作固有的完整内存屏障属性。其他选项,例如 MFENCE,可能会提供较弱的保证或不同的性能特征,具体取决于特定的硬件和操作条件。

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

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