C++内存序memory_order的具体操作

 更新时间:2025年07月11日 10:12:19   作者:Damon_X  
C++原子操作提供6种内存序,用于控制多线程内存重排序,确保并发正确性,下面就来具体介绍一下,感兴趣的可以了解一下

C++ 原子操作提供 6种内存序(memory_order),分别控制编译器和 CPU 如何对内存操作进行重排序优化,确保并发程序在多线程之间的行为可控、正确。

所有内存序(memory_order)

C++ 中 std::memory_order 的 6 种选项如下:

枚举值中文名简要说明
memory_order_relaxed放松序不保证任何顺序,只保证原子性
memory_order_consume消费序(已废弃趋势)数据依赖同步,仅限依赖关系(不推荐使用)
memory_order_acquire获取序保证本线程之后的操作不会被重排到原子操作前
memory_order_release释放序保证本线程之前的操作不会被重排到原子操作后
memory_order_acq_rel获取 + 释放序同时保证 acquire + release 的效果,适用于 read-modify-write 操作
memory_order_seq_cst顺序一致性(默认)最强的保证:所有线程中看起来像是全局有序执行

简明图解理解(线程内操作顺序)

  • relaxed: 无序(性能最好,但易出错)
  • acquire: 不能把后面的操作移到前面
  • release: 不能把前面的操作移到后面
  • acq_rel: 二者兼具
  • seq_cst: 所有线程观察到的执行顺序一致

常见用法示例对比

默认顺序一致性memory_order_seq_cst

#include <atomic>

std::atomic<int> x{0};  // 初始化为 0
x.store(10);                  // store (默认 seq_cst)
int v = x.load();             // load (默认 seq_cst)

顺序一致性:多线程中所有原子操作全局有序,易于理解但开销较大。 

放松序 memory_order_relaxed

#include <atomic>

std::atomic<int> x{0};  // 初始化为 0
// 线程 A
x.store(10, std::memory_order_relaxed);  // 原子写,不保证顺序

// 线程 B
int value = x.load(std::memory_order_relaxed);  // 原子读,不保证看到更新

获取 / 释放语义:典型锁实现方式

#include <atomic>

std::atomic<bool> flag{false};  // 默认未设置

// 线程 A:写线程
data = 123;  // 假设 data 是共享变量
flag.store(true, std::memory_order_release);  // 发布 data 已准备好

// 线程 B:读线程
if (flag.load(std::memory_order_acquire)) {
    // 这里看到 flag == true
    // 根据 acquire 语义:保证看到的 data = 123
    std::cout << data << std::endl;
}

这就是经典的 “写线程 release,读线程 acquire” 搭配,确保读线程看到完整写入的数据。

atomic_flag使用场景建议的 memory_order

操作类型推荐的 memory_order
flag.test_and_setstd::memory_order_acquire
flag.clearstd::memory_order_release

小结

序名用途是否有序性能说明
relaxed最快的,不同步🔥🔥🔥仅原子性,无顺序
acquire用于加锁✅(后有序)🔥🔥加锁读
release用于解锁✅(前有序)🔥🔥解锁写
acq_rel读写同时🔥用于 fetch_add 等
seq_cst最强顺序保证✅✅✅🐢默认值,全局有序
consume基本弃用不推荐

到此这篇关于C++内存序memory_order的具体操作的文章就介绍到这了,更多相关C++ memory_order内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Qt图片绘图类之QPixmap/QImage/QPicture详解

    Qt图片绘图类之QPixmap/QImage/QPicture详解

    这篇文章主要为大家详细介绍了Qt图片绘图类中QPixmap、QImage和QPicture的使用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • 解决 VSCode 编写 C++11 代码报红问题分析

    解决 VSCode 编写 C++11 代码报红问题分析

    今天在写 C++ 代码的时候用上 C++11 的特性,然后发现 VSCode 虽然可以编译通过,但是会在相应位置报红,这是怎么回事呢?下面小编给大家带来了解决方法,一起看看吧
    2021-09-09
  • C++深入探究类与对象之友元与运算符重载

    C++深入探究类与对象之友元与运算符重载

    友元就是让一个函数或者类,访问另一个类中的私有成员;打个比方,这相当于是说:朋友是值得信任的,所以可以对他们公开一些自己的隐私,运算符重载的实质就是函数重载或函数多态,运算符重载是一种形式的C++多态,目的在于让人能够用同名的函数来完成不同的基本操作
    2022-04-04
  • 使用C语言计算长方体的表面积和体积

    使用C语言计算长方体的表面积和体积

    这篇文章主要给大家介绍了关于如何使用C语言计算长方体的表面积和体积的相关资料,在C语言中,我们可以使用乘法运算符(*)来进行乘法运算,并将结果保存在一个变量中,需要的朋友可以参考下
    2023-10-10
  • Qt创建SQlite数据库的示例代码

    Qt创建SQlite数据库的示例代码

    本文主要介绍了Qt创建SQlite数据库的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C语言sizeof与字符串处理与动态内存分配及main函数参数详解

    C语言sizeof与字符串处理与动态内存分配及main函数参数详解

    这篇文章主要介绍了C语言字符串处理函数、sizeof、动态内存分配函数、main函数参数问题,static在修饰变量的时候,如果是修饰全局变量,则跟全局变量功能一样,通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • C语言实现打砖块小游戏

    C语言实现打砖块小游戏

    这篇文章主要为大家详细介绍了C语言实现打砖块小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 浅谈C++流库的基本结构

    浅谈C++流库的基本结构

    本文主要介绍了浅谈C++流库的基本结构,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • C/C++中二进制文件&顺序读写详解及其作用介绍

    C/C++中二进制文件&顺序读写详解及其作用介绍

    这篇文章主要介绍了C/C++中二进制文件&顺序读写详解及其作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • while和for可以相互转换的例子分享

    while和for可以相互转换的例子分享

    这篇文章主要介绍了while和for可以相互转换的例子,需要的朋友可以参考下
    2014-02-02

最新评论