0

0

c++的std::memory_order是什么 原子操作的内存序详解【并发进阶】

冰火之心

冰火之心

发布时间:2025-12-19 10:17:25

|

753人浏览过

|

来源于php中文网

原创

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

c++的std::memory_order是什么 原子操作的内存序详解【并发进阶】

std::memory_order 是什么

它是一组枚举值,用来告诉编译器和 CPU:在执行原子操作时,周围的普通读写操作**可以怎么重排**、**对其他线程可见的顺序如何保证**。它不改变原子操作本身的原子性,而是控制该操作与其他内存访问之间的**同步关系和可见性边界**。

为什么需要内存序

现代 CPU 和编译器为了性能,会做两类重排:

  • 编译器重排:在不改变单线程语义的前提下,调整指令顺序(比如把读操作提前)
  • CPU 重排:乱序执行、写缓冲区延迟刷新、缓存不一致等,导致多线程下看到的执行顺序和代码顺序不一致

如果没有显式约束,两个线程可能永远看不到彼此的修改——看似正确的原子变量,实际无法完成同步。内存序就是为了解决这个问题而设的“围栏”或“承诺”。

六种 memory_order 及典型用途

注意:所有 memory_order 都只对当前这条原子操作生效,影响的是它与前后非原子/原子访问的相对顺序。

AI抖音
AI抖音

AI抖音,会思考的抖音

下载

立即学习C++免费学习笔记(深入)”;

  • memory_order_relaxed:最弱。仅保证该原子操作自身是原子的,不施加任何顺序约束。适用于计数器、句柄生成等无需同步的场景。
  • memory_order_consume:已基本被弃用。理论上用于数据依赖关系(如指针解引用),但因实现复杂且易出错,实践中建议用 acquire 替代。
  • memory_order_acquire:用于读操作(load)。保证该 load 之后的所有读写(包括非原子)不能被重排到它前面。常作为“获取锁”或“读取共享数据前的同步点”。
  • memory_order_release:用于写操作(store)。保证该 store 之前的所有读写(包括非原子)不能被重排到它后面。常作为“释放锁”或“写完共享数据后的同步点”。
  • memory_order_acq_rel:用于读-改-写操作(如 fetch_add、compare_exchange)。兼具 acquire 和 release 的语义,即前后都不可重排。
  • memory_order_seq_cst:默认值,最强。所有带此序的原子操作构成一个全局单一执行顺序,就像所有线程按某种统一时间线串行执行一样。安全但可能有性能代价。

acquire-release 配对是核心模式

这是最常用也最关键的同步模型。它不要求全局顺序,只要求两件事:

  • 线程 A 执行了 flag.store(true, memory_order_release),且之前写了数据 data = 42
  • 线程 B 执行了 if (flag.load(memory_order_acquire)) { use(data); }
  • 那么一旦 B 看到 flag == true,就一定能安全读到 data == 42 —— 编译器和 CPU 都不会把 data = 42 重排到 store(flag) 后面,也不会把 use(data) 重排到 load(flag) 前面

这种配对构成了“synchronizes-with”关系,是 C++ 内存模型中定义正确同步的基础。

别盲目用 seq_cst,但也别过早优化

初学时用 memory_order_seq_cst 没问题,逻辑清晰、不易出错;等你明确知道瓶颈在哪、且确认 relax/acquire/release 能满足语义时,再谨慎替换。比如无锁队列、RCU、信号量内部等场景才真正需要细粒度控制。多数业务代码里,用好 mutex 或 atomic + seq_cst 就足够安全。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

820

2023.08.22

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

675

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

366

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

26

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

24

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

98

2026.02.06

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

561

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

165

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

90

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.7万人学习

C 教程
C 教程

共75课时 | 4.8万人学习

C++教程
C++教程

共115课时 | 18.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号