基础能力系列 - 多线程1 - 内存序

C++11 定义了 6 种原子操作的内存序(memory order) ,用于控制多线程中的可见性和重排序规则。如下是六种内存序的简介、特点和适用场景:


六种内存序一览表

内存序名称 描述 / 特点 是否同步其他线程可见性 是否禁止重排序 使用场景示例
memory_order_relaxed 最弱序,无同步,无重排序限制 不同步其他线程 允许重排序 统计计数器、自增编号等
memory_order_consume 数据依赖同步(已废弃) 实际等同 acquire 编译器优化误差多 几乎不用
memory_order_acquire 获取操作,防止之后操作被重排序到前面 同步前写可见 禁止之后操作重排序 load 时读取同步数据
memory_order_release 释放操作,防止之前操作被重排序到后面 同步后读可见 禁止之前操作重排序 store 时写入同步数据
memory_order_acq_rel 同时具有 acquire 和 release 效果 双向同步 全部禁止重排序 常用于 fetch_add 等读改写操作
memory_order_seq_cst 最强序,全局顺序一致性 所有线程可见 强制全局顺序 多线程安全,易理解但性能最低

实用说明

memory_order_relaxed`

  • 不做任何同步,仅保证原子性。
  • 不保证其他线程看到值变化的顺序。
cpp 复制代码
std::atomic<int> x(0);
x.store(1, std::memory_order_relaxed); // 线程B可能看不到

memory_order_acquire`

  • 常用于 load 操作。
  • 保证:本线程对该变量之后的操作不会被提到它前面。
cpp 复制代码
int data = 0;
std::atomic<bool> ready = false;

// 线程A
data = 42;
ready.store(true, std::memory_order_release);

// 线程B
while (!ready.load(std::memory_order_acquire));
std::cout << data; // 始终能看到 data = 42

memory_order_release`

  • 常用于 store 操作。
  • 保证:本线程在此之前的写入对其他 acquire 线程可见。

memory_order_acq_rel`

  • 用于 读-改-写原子操作 :如 fetch_add、compare_exchange
  • 保证:在操作前后都不能乱序
cpp 复制代码
counter.fetch_add(1, std::memory_order_acq_rel);

memory_order_seq_cst`

  • "Sequential Consistency":最直观的并发语义
  • 保证所有线程看到的修改具有全局一致顺序
  • 对于简单并发程序是最安全选择,但性能可能不理想

memory_order_consume`

  • 理论上只依赖"数据依赖性",但已在实践中废弃(比如 gcc/clang 实际当作 acquire 处理)

小结

复制代码
     Relaxed < Acquire/Release < Acq_Rel < Seq_Cst
           (低同步/快)          →          (高同步/慢)

: 基础能力系列
: 区块链知识系列
: 密码学系列
: 零知识证明系列
: 共识系列
: 公链调研系列
: BTC系列
: 以太坊系列
: EOS系列
: Filecoin系列
: 联盟链系列
: Fabric系列
: 智能合约系列
: Token系列

相关推荐
开开心心就好12 分钟前
白天晚上自动调蓝光,护眼工具亮度可调
服务器·开发语言·算法·pdf·ocr·intellij-idea·idea
Jsundoku1 小时前
第六章 机器学习 -- 支持向量机
算法·机器学习·支持向量机
?abc!2 小时前
(数组)448. 找到所有数组中消失的数字
算法
淡海水2 小时前
05-03-源码-Boehm GC分配与碎片管理
开发语言·算法·unity·c#·游戏引擎·gc
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C/C++考级:任意进制互转与大数多进制加法解析
c++·python·算法·bfs·信息学竞赛
多弗朗皮卡丘2 小时前
C++ 哈希(下)
c++·算法·哈希算法
aichitang20243 小时前
Meta Muse Spark Open:816B 巨型开放权重多模态 Agent 模型架构、部署实战与社区首测全解
大数据·人工智能·python·算法·ai·架构·spark
Coder-magician3 小时前
图论总结篇
算法·图论
有同事要进步3 小时前
Leecode第68题:x的平方根
java·数据结构·算法