为什么 std::atomic 的存储采用 XCHG 来实现顺序一致性
在 x86 和 x86_64 架构的 std::atomic 上下文中,a具有顺序一致性的存储操作 (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 语义的原子读取操作来强制执行。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3