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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • C语言实现链表与文件存取的示例代码

    C语言实现链表与文件存取的示例代码

    这篇文章主要和大家分享C语言实现链表与文件存取的示例代码,可以实现建立链表,然后把链表数据存储到文件中,然后把文件数据存储到数组中并输出,感兴趣的可以学习一下
    2022-04-04
  • C语言示例讲解结构体的声明与初始化方法

    C语言示例讲解结构体的声明与初始化方法

    结构体是一些值的集合,这些值称为成员变量,结构体的每个成员可以是不同类型的变量。本文将通过示例为大家详细讲讲C语言中结构体的使用,需要的可以参考一下
    2022-07-07
  • C++中类的成员函数及内联函数使用及说明

    C++中类的成员函数及内联函数使用及说明

    这篇文章主要介绍了C++中类的成员函数及内联函数使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++中指针的详解及其作用介绍

    C++中指针的详解及其作用介绍

    这篇文章主要介绍了C++中指针的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 用C实现PHP扩展 Fetch_Url 类数据抓取的方法

    用C实现PHP扩展 Fetch_Url 类数据抓取的方法

    该扩展是基于libcurl基础实现的网页数据抓取
    2013-04-04
  • C++中的类扩展之继承和组合详解

    C++中的类扩展之继承和组合详解

    在C++中,类扩展可以通过继承、组合和装饰模式实现。继承可以实现对已有类的修改和扩展,组合可以增加新的功能,装饰模式则能够在不改变原类的情况下为其添加新的功能。这些技术在C++程序设计中应用广泛,提高了程序的可扩展性和可维护性
    2023-04-04
  • QString和char以及string之间的赋值详解

    QString和char以及string之间的赋值详解

    QString 、string 、char* 之间免不了相互赋值。下面是自己的总结。需要的朋友可以过来参考下
    2013-10-10
  • Visual Studio 2019 DLL动态库连接实例(图文教程)

    Visual Studio 2019 DLL动态库连接实例(图文教程)

    这篇文章主要介绍了Visual Studio 2019 DLL动态库连接实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • C语言算术运算符整理

    C语言算术运算符整理

    算术运算符用于各类数值运算,包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种
    2023-03-03
  • C++中string的模拟实现

    C++中string的模拟实现

    这篇文章主要为大家详细介绍了C++中string的模拟实现,感兴趣的小伙伴们可以参考一下
    2016-08-08

最新评论