0

0

C++原子操作使用 memory_order内存序

P粉602998670

P粉602998670

发布时间:2025-09-01 09:50:02

|

411人浏览过

|

来源于php中文网

原创

内存序是C++原子操作中控制内存访问顺序的枚举值,用于保证线程安全并提升性能。常用内存序包括memory_order_relaxed(仅保证原子性)、memory_order_acquire(读操作后不重排)、memory_order_release(写操作前不重排)、memory_order_acq_rel(兼具 acquire 和 release)和memory_order_seq_cst(默认强一致)。使用场景包括:计数器用relaxed、线程间同步用acquire-release、需全局顺序时用seq_cst。选择原则是在正确性前提下使用最弱内存序,避免不必要的性能开销。

c++原子操作使用 memory_order内存序

在C++多线程编程中,原子操作(

std::atomic
)是实现线程安全的重要工具。而内存序(
memory_order
)则控制原子操作周围的内存访问顺序,影响性能和正确性。合理使用内存序可以在保证程序正确的同时提升效率。

memory_order 是什么?

内存序是C++原子操作中用于指定同步语义的枚举值,定义在

头文件中。它决定了原子操作如何与其它内存操作(包括原子和非原子)进行排序,防止编译器和CPU重排序带来的问题。

常用的内存序包括:

  • memory_order_relaxed:最弱的顺序,仅保证原子性,不提供同步或顺序约束。
  • memory_order_acquire:用于读操作,保证该操作之后的读写不会被重排到该操作之前。
  • memory_order_release:用于写操作,保证该操作之前的读写不会被重排到该操作之后。
  • memory_order_acq_rel:同时具备 acquire 和 release 语义,常用于读-修改-写操作。
  • memory_order_seq_cst:默认顺序,提供全局顺序一致性,最安全但也最慢。

不同 memory_order 的使用场景

选择合适的内存序取决于你的同步需求。以下是常见场景和推荐用法:

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

1. 使用 memory_order_relaxed 计数器

当你只需要原子性,而不需要同步其他内存操作时,可以用 relaxed 模型。例如统计事件次数:

std::atomic counter{0};

void increment() {
    counter.fetch_add(1, std::memory_order_relaxed);
}

int get_count() {
    return counter.load(std::memory_order_relaxed);
}

这里不涉及共享数据的同步,relaxed 足够且高效。

2. acquire-release 实现线程间同步

95Shop仿醉品商城
95Shop仿醉品商城

95Shop可以免费下载使用,是一款仿醉品商城网店系统,内置SEO优化,具有模块丰富、管理简洁直观,操作易用等特点,系统功能完整,运行速度较快,采用ASP.NET(C#)技术开发,配合SQL Serve2000数据库存储数据,运行环境为微软ASP.NET 2.0。95Shop官方网站定期开发新功能和维护升级。可以放心使用! 安装运行方法 1、下载软件压缩包; 2、将下载的软件压缩包解压缩,得到we

下载

当你需要一个线程写入数据,另一个线程读取时,可用 release-acquire 模型实现同步:

std::atomic ready{false};
int data = 0;

// 线程1:写入数据并设置标志
void producer() {
    data = 42;  // 写共享数据
    ready.store(true, std::memory_order_release);  // release:确保 data 写入在前
}

// 线程2:等待标志并读取数据
void consumer() {
    while (!ready.load(std::memory_order_acquire)) {  // acquire:确保后续读取能看到 data
        // 等待
    }
    // 此时 data 一定是 42
    printf("data = %d\n", data);
}

release 保证 store 之前的写不会被重排到 store 之后,acquire 保证 load 之后的读不会被重排到 load 之前,从而确保 data 的正确读取。

3. memory_order_seq_cst:默认的强一致性

这是所有原子操作的默认内存序。它提供最直观的行为:所有线程看到的原子操作顺序是一致的。

std::atomic x{0}, y{0};

// 线程1
x.store(1, std::memory_order_seq_cst);

// 线程2
y.store(1, std::memory_order_seq_cst);

// 线程3
if (x.load(std::memory_order_seq_cst) == 1 && y.load() == 0) {
    // 其他线程不会同时看到 y == 0
}

seq_cst 像所有原子操作被串行执行,适合对正确性要求高、性能要求不极端的场景。

如何选择合适的内存序?

基本原则是:在满足正确性的前提下,使用尽可能弱的内存序。

  • 仅需原子性(如计数器)→ memory_order_relaxed
  • 实现锁或同步标志 → acquire/release
  • 需要全局顺序一致 → memory_order_seq_cst
  • 读-修改-写操作(如 fetch_add)常配合 memory_order_acq_rel

注意:使用弱内存序时,必须清楚数据依赖和同步关系,否则容易引入难以调试的竞态条件。

基本上就这些。内存序不是越强越好,理解其语义才能写出高效又安全的并发代码。

相关专题

更多
线程和进程的区别
线程和进程的区别

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

482

2023.08.10

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

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

143

2025.12.24

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

61

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

java输出数组相关教程
java输出数组相关教程

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

39

2026.01.19

java接口相关教程
java接口相关教程

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

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

19

2026.01.19

热门下载

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

精品课程

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

共94课时 | 7.2万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 13万人学习

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

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