23.C++11引入的内存序

本文介绍了C++中的内存序概念,包括顺序一致性、获取-释放次序和宽松内存序,解释了如何通过内存次序控制多线程间的内存可见性,以避免数据竞争和确保正确同步。通过示例展示了不同内存序在实际编程中的应用及其影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++内存序


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


内存序是为了在做原子操作时,控制多线程间内存可见性的一种机制,从而有助于避免数据争用并确保正确同步。

之所以要对原子操作的内存序做限制还是在于编译器编译时和cpu运行指令时会对指令做重排优化。这可能会导致意外的结果。关于指令乱序可以参考乱序执行与内存屏障C++11中的内存模型上篇 - 内存模型基础

c++11中引入的原子类型上的操作服从 6 种内存次序:

  • memory_order_relaxed
  • memory_order_consume
  • memory_order_acquire
  • memory_order_release
  • memory_order_acq_rel
  • memory_order_seq_cst

memory_order_seq_cst是可选的最严格的内存次序,各种原子类型的所有操作都默认遵从该次序,除非我们特意为某项操作另行指定。

内存次序共有6种,但它们只代表3种模式:

  • 先后一致次序,memory_order_seq_cst
  • 获取-释放次序, memory_order_consume、memory_order_acquire、memory_order_releasememory_order_acq_rel
  • 宽松次序,memory_order_relaxed

顺序一致性

顺序一致性是一种相对的内存序,它允许在原子操作之间插入任意数量的其他操作,只要这些操作遵循顺序一致性,那么原子操作的顺序就和它们在代码中的顺序一致。

顺序一致性Sequential Consistency,简称SC,所有处理器都只能看到一个单一的操作执行顺序,顺序一致性实际上是一种强一致性,可以想象成整个程序过程中由一个开关来选择执行的线程,这样才能同时保证顺序一致性。

#include <atomic>
#include <thread>
#include <assert.h>
std::atomic<bool> x,y;
std::atomic<int> z;

std::memory_order m = std::memory_order_seq_cst;

void write_x()
{
   
    x.store(true, m);
}

void write_y()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值