首页 >后端开发 >C++ >为什么 `std::atomic` 使用 `XCHG` 进行顺序一致存储?

为什么 `std::atomic` 使用 `XCHG` 进行顺序一致存储?

Linda Hamilton
Linda Hamilton原创
2024-11-24 01:37:141052浏览

Why Does `std::atomic` Use `XCHG` for Sequentially Consistent Stores?

为什么 std::atomic 使用 XCHG 进行顺序一致性存储

背景

在多线程领域,std::atomic 类提供了意味着跨线程并发访问共享数据,同时确保数据完整性。它的 store 成员函数允许使用指定的内存排序语义将值写入原子变量。

在顺序一致性 (std::memory_order_seq_cst) 的情况下,x86 架构使用 xchg 指令来实现原子存储。该指令执行同时交换值,而不是简单的存储操作。

XCHG 的动机

虽然可能看起来简单的存储指令与内存屏障相结合(例如,_ReadWriteBarrier()或 asm 易失性("" ::: "内存");) 足以保证顺序一致性,使用 xchg 有几个优点:

1。完整内存屏障: xchg 由于其隐式锁前缀,在 x86 上充当完整的内存屏障。这样可以确保xchg之前和之后的所有内存操作都是有序的,有效防止内存重新排序。

2.发布语义不足: x86 上的正常存储操作表现出发布语义,它允许对后续操作(包括获取加载)进行重新排序。另一方面,顺序一致性要求禁止此类重新排序。

性能注意事项

原子存储的 xchg 和 mov mfence 之间的选择具有性能影响:

  • Skylake: mfence 停止 ALU 指令的无序执行,而 xchg 则不然。但是,xchg 对先前加载的值存在错误依赖。
  • AMD:硬件优化手册建议使用 xchg 进行顺序一致性存储。
  • GCC/ Clang 优化: 现代编译器通常更喜欢 xchg 而不是 mov mfence.

线程栅栏的替代方案

除了使用 xchg 进行原子存储之外,实现原子线程栅栏的其他选项(也使用 seq_cst 内存排序)包括:

  • lock 添加到堆栈
  • lock 或 dword [rsp], 0

区分释放和获取

需要注意的是:

  • 具有顺序一致性的存储并不意味着获取语义。
  • asm volatile("" ::: "memory");仅是编译器屏障,不强制执行顺序一致性。
  • 使用较弱顺序操作和栅栏模拟顺序一致性可能与 C 抽象机模型不完全一致。

结论

总而言之,x86 架构上具有顺序一致性的 std::atomic 存储利用 xchg,因为它具有完整的内存屏障效应以及与顺序要求的兼容性 一致性。尽管存在替代实现,但 xchg 因其效率和符合行业建议而仍然是广泛采用的解决方案。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn