当前位置: 代码网 > it编程>编程语言>C/C++ > C++内存序memory_order的具体操作

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

2025年07月11日 C/C++ 我要评论
c++ 原子操作提供 6种内存序(memory_order),分别控制编译器和 cpu 如何对内存操作进行重排序优化,确保并发程序在多线程之间的行为可控、正确。所有内存序(memory_order)c

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com