std::atomic::load必须指定memory_order,因默认std::memory_order_seq_cst开销最大;实际中依场景选acquire(同步)或relaxed(独立读取)可提升性能。

std::atomic::load 为什么必须指定 memory_order?
不指定内存顺序时,std::atomic::load 默认用 std::memory_order_seq_cst,性能开销最大。它强制全局顺序一致,但多数场景不需要这么强的保证——比如只读共享计数器、状态标志位,用更弱的顺序就能避免不必要的内存屏障。
- 默认行为等价于
load(std::memory_order_seq_cst),x86 上会插入mfence或隐含序列化语义 - 若变量仅用于同步(如通知另一个线程“数据已就绪”),
std::memory_order_acquire就够了 - 若只是原子读取一个独立计数器(无依赖其他内存操作),
std::memory_order_relaxed最快,但编译器和 CPU 都可能重排它前后的普通读写
std::memory_order_acquire 和 std::memory_order_relaxed 的实际区别
关键不在“能不能读到最新值”,而在于它对周围普通内存访问的约束力。假设有一个 flag 和一个 data:
load
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











