为什么 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 之间的选择存储操作涉及性能权衡。
实现详细信息
在实践中,std::atomic 具有顺序一致性的存储的具体实现因编译器和硬件架构而异。
隐式获取栅栏
x86 存储具有隐式获取栅栏的说法是不正确的。 x86 上的存储具有释放语义,而不是获取语义。获取语义通常使用内存屏障(例如 mfence)或带有 std::memory_order_acquire 语义的原子读取操作来强制执行。
以上是为什么 `std::atomic` 的存储使用 XCHG 来实现 x86 上的顺序一致性?的详细内容。更多信息请关注PHP中文网其他相关文章!