基础能力系列 - 多线程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_addcompare_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系列

相关推荐
没落之王9 小时前
易学使者郑氏正脉郑冰推演马航事件
大数据·人工智能·算法·机器学习·可用性测试
阿部多瑞 ABU9 小时前
告别手工核图:基于 .NET + MuPDFCore 的 CAD 等轴测 PDF 材料表提取与新旧版本对比实战
后端·算法·ui·pdf·c#
郝学胜-神的一滴9 小时前
并查集深度入门:从玄学抽象到 QuickFind & QuickUnion 源码实战
数据结构·c++·python·程序人生·算法·软件开发
比奇堡裤头村9 小时前
统计学习方法——决策树
算法·决策树·学习方法
灵晔君9 小时前
【Linux】进程控制(一)——进程创建、进程终止与进程等待
linux·c语言·算法
数模竞赛Paid answer18 小时前
2026年中青杯数学建模A题数学建模论文智能评估系统与多智能体优化方法求解全过程论文及程序
算法·数学建模·中青杯
银-豆豆19 小时前
数据结构与算法-动态规划、回溯与贪心
算法·动态规划
想吃火锅100520 小时前
【leetcode】200. 岛屿数量
算法·leetcode·职场和发展
Nil20821 小时前
leetcode 54螺旋矩阵
算法·leetcode·矩阵
依然鸣1 天前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论