std::memory_order是一组枚举值,用于约束原子操作周围内存访问的重排行为及跨线程可见性,不改变原子性本身;它解决编译器/CPU重排导致的多线程同步失效问题,含relaxed、consume(弃用)、acquire、release、acq_rel、seq_cst六种,其中acquire-release配对构成核心同步模型。
它是一组枚举值,用来告诉编译器和 CPU:在执行原子操作时,周围的普通读写操作**可以怎么重排**、**对其他线程可见的顺序如何保证**。它不改变原子操作本身的原子性,而是控
制该操作与其他内存访问之间的**同步关系和可见性边界**。
现代 CPU 和编译器为了性能,会做两类重排:
如果没有显式约束,两个线程可能永远看不到彼此的修改——看似正确的原子变量,实际无法完成同步。内存序就是为了解决这个问题而设的“围栏”或“承诺”。
注意:所有 memory_order 都只对当前这条原子操作生效,影响的是它与前后非原子/原子访问的相对顺序。
这是最常用也最关键的同步模型。它不要求全局顺序,只要求两件事:
flag.store(true, memory_order_release),且之前写了数据 data = 42
if (flag.load(memory_order_acquire)) { use(data); }
data = 42 重排到 store(flag) 后面,也不会把 use(data) 重排到 load(flag) 前面这种配对构成了“synchronizes-with”关系,是 C++ 内存模型中定义正确同步的基础。
初学时用 memory_order_seq_cst 没问题,逻辑清晰、不易出错;等你明确知道瓶颈在哪、且确认 relax/acquire/release 能满足语义时,再谨慎替换。比如无锁队列、RCU、信号量内部等场景才真正需要细粒度控制。多数业务代码里,用好 mutex 或 atomic