std::memory_order是一组枚举值,用于约束原子操作周围内存访问的重排行为及跨线程可见性,不改变原子性本身;它解决编译器/CPU重排导致的多线程同步失效问题,含relaxed、consume(弃用)、acquire、release、acq_rel、seq_cst六种,其中acquire-release配对构成核心同步模型。

std::memory_order 是什么
它是一组枚举值,用来告诉编译器和 CPU:在执行原子操作时,周围的普通读写操作**可以怎么重排**、**对其他线程可见的顺序如何保证**。它不改变原子操作本身的原子性,而是控制该操作与其他内存访问之间的**同步关系和可见性边界**。
为什么需要内存序
现代 CPU 和编译器为了性能,会做两类重排:
- 编译器重排:在不改变单线程语义的前提下,调整指令顺序(比如把读操作提前)
- CPU 重排:乱序执行、写缓冲区延迟刷新、缓存不一致等,导致多线程下看到的执行顺序和代码顺序不一致
如果没有显式约束,两个线程可能永远看不到彼此的修改——看似正确的原子变量,实际无法完成同步。内存序就是为了解决这个问题而设的“围栏”或“承诺”。
六种 memory_order 及典型用途
注意:所有 memory_order 都只对当前这条原子操作生效,影响的是它与前后非原子/原子访问的相对顺序。
立即学习“C++免费学习笔记(深入)”;
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~