在多线程领域,std::atomic 类提供了意味着跨线程并发访问共享数据,同时确保数据完整性。它的 store 成员函数允许使用指定的内存排序语义将值写入原子变量。
在顺序一致性 (std::memory_order_seq_cst) 的情况下,x86 架构使用 xchg 指令来实现原子存储。该指令执行同时交换值,而不是简单的存储操作。
虽然可能看起来简单的存储指令与内存屏障相结合(例如,_ReadWriteBarrier()或 asm 易失性("" ::: "内存");) 足以保证顺序一致性,使用 xchg 有几个优点:
1。完整内存屏障: xchg 由于其隐式锁前缀,在 x86 上充当完整的内存屏障。这样可以确保xchg之前和之后的所有内存操作都是有序的,有效防止内存重新排序。
2.发布语义不足: x86 上的正常存储操作表现出发布语义,它允许对后续操作(包括获取加载)进行重新排序。另一方面,顺序一致性要求禁止此类重新排序。
原子存储的 xchg 和 mov mfence 之间的选择具有性能影响:
除了使用 xchg 进行原子存储之外,实现原子线程栅栏的其他选项(也使用 seq_cst 内存排序)包括:
需要注意的是:
总而言之,x86 架构上具有顺序一致性的 std::atomic 存储利用 xchg,因为它具有完整的内存屏障效应以及与顺序要求的兼容性 一致性。尽管存在替代实现,但 xchg 因其效率和符合行业建议而仍然是广泛采用的解决方案。
以上是为什么 `std::atomic` 使用 `XCHG` 进行顺序一致存储?的详细内容。更多信息请关注PHP中文网其他相关文章!