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中文网其他相关文章!