首页 > 系统相关 >C++中的内存序std::memory_orde_*

C++中的内存序std::memory_orde_*

时间:2022-12-29 11:00:58浏览次数:65  
标签:std orde C++ 线程 内存 memory release 操作 order

摘自:https://cloud.tencent.com/developer/article/2026043


1) C++11中引入了六种内存约束符用以解决多线程下的内存一致性问题(在头文件<atomic>中),其定义如下:

typedef enum memory_order {
    memory_order_relaxed,
    memory_order_consume,
    memory_order_acquire,
    memory_order_release,
    memory_order_acq_rel,
    memory_order_seq_cst
} memory_order;


1) 这六种内存约束符从读/写的角度进行划分的话,可以分为以下三种:

  • 读操作(memory_order_acquire memory_order_consume)
  • 写操作(memory_order_release)
  • 读-修改-写操作(memory_order_acq_rel memory_order_seq_cst)

ps: 因为memory_order_relaxed没有定义同步和排序约束,所以它不适合这个分类。


2) 从访问控制的角度可以分为以下三种:

  • Sequential consistency模型(memory_order_seq_cst)
  • Relax模型(memory_order_relaxed)
  • Acquire-Release模型(memory_order_consume   memory_order_acquire   memory_order_release   memory_order_acq_rel)

从访问控制的强弱排序,Sequential consistency模型最强,Acquire-Release模型次之,Relax模型最弱。


3) C++11提供的6种内存访问约束符中:

  • memory_order_release:在当前线程T1中,该操作X之前的任何读写操作指令都不能放在操作X之后。如果其它线程对同一变量使用了memory_order_acquire或者memory_order_consume约束符,则当前线程写操作之前的任何读写操作都对其它线程可见(注意consume的话是依赖关系可见)
  • memory_order_acquire:在当前线程中,load操作之后的依赖于此原子变量的读和写操作都不能被重排到当前指令前。如果有其他线程使用memory_order_release内存模型对此原子变量进行store操作,在当前线程中是可见的。
  • memory_order_relaxed:没有同步或顺序制约,仅对此操作要求原子性
  • memory_order_consume:在当前线程中,load操作之后的依赖于此原子变量的读和写操作都不能被重排到当前指令前。如果有其他线程使用memory_order_release内存模型对此原子变量进行store操作,在当前线程中是可见的。
  • memory_order_acq_rel:等同于对原子变量同时使用memory_order_release和memory_order_acquire约束符
  • memory_order_seq_cst:从宏观角度看,线程的执行顺序与代码顺序严格一致


C++的内存模型则是依赖上面六种内存约束符来实现的:

  • Relax模型:对应的是memory_order中的memory_order_relaxed。从其字面意思就能看出,其对于内存序的限制最小,也就是说这种方式只能保证当前的数据访问是原子操作(不会被其他线程的操作打断),但是对内存访问顺序没有任何约束,也就是说对不同的数据的读写可能会被重新排序
  • Acquire-Release模型:对应的memory_order_consume memory_order_acquire memory_order_release memory_order_acq_rel约束符(需要互相配合使用);对于一个原子变量A,对A的写操作(Release)和读操作(Acquire)之间进行同步,并建立排序约束关系,即对于写操作(release)X,在写操作X之前的所有读写指令都不能放到写操作X之后;对于读操作(acquire)Y,在读操作Y之后的所有读写指令都不能放到读操作Y之前。
  • Sequential consistency模型:对应的memory_order_seq_cst约束符;程序的执行顺序与代码顺序严格一致,也就是说,在顺序一致性模型中,不存在指令乱序。


4) 下面这幅图大致梳理了内存模型的核心概念

717f8ef57d02a35f2d8fb3ee895068f2

标签:std,orde,C++,线程,内存,memory,release,操作,order
From: https://www.cnblogs.com/gispathfinder/p/17011932.html

相关文章

  • C++ 数学与算法系列之高斯消元法求解线性方程组
    1.前言什么是消元法?消元法是指将多个方程式组成的方程组中的若干个变量通过有限次地变换,消去方程式中的变量,通过简化方程式,从而获取结果的一种解题方法。消元法主要有代......
  • C++性能分析工具gperftools
    最近编写的程序遇到了性能瓶颈,CPU吃满的情况下消费能力上不去,导致消息积压迟迟得不到消费,最终被kafka丢弃于是开始对程序进行调优,提高消费能力,便找到这个工具,找到程序中使......
  • LeetCode_Heap_剑指 Offer 40. 最小的k个数 【堆,泛型实现,自定义比较器】【C++/java】
    目录​​一,题目描述​​​​英文描述​​​​中文描述​​​​示例与说明​​​​二,解题思路​​​​1,手动实现堆——C++泛型实现​​​​2,手动实现堆——java泛型实现​​......
  • VC++6.0显示代码行号
    转载自:https://blog.csdn.net/myblog_dwh/article/details/22582741VC6.0是一款比较稳定的功能强大的IDE,目前也有很多人在使用。但美中不足的是它不能像其他IDE那样显示......
  • C/C++程序设计综合实践指导[2021级]
    C/C++程序设计综合实践指导[2021级]2021级程序设计综合实践指导一、综合实践要求综合实践是C语言程序设计、C++到数据结构三门课程的一个综合实践练习,是有别于课程实验......
  • 推荐 10 款 C++ 在线编译器
    1CodingGroundUrl:​https://www.tutorialspoint.com/compile_cpp_online.php​​CodingGround是Tutorialspoint(很强大的免费教程网站)的一个编码平台。它提供的编译器支......
  • C++/Qt 系列推荐 - ORM(对象关系映射)
    教程目录以下是教程目录,从理论到实战,一步步深入ORM:​​快速认识ORM​​​​QxOrm介绍、下载、编译​​​​QxOrm快速上手​​​​在Ubuntu上安装MySQL​​​​QMYSQL......
  • C++工资管理系统
    C++工资管理系统参考题目3:工资管理系统该系统在磁盘上存储了某单位全体职工的工资信息。对于每位职工存储以下信息:职工编号、基本工资、津贴、岗贴、补贴、应发数、个......
  • 【杂谈】工程能力差,C++水平菜?CUDA没写过?我推荐玩下Caffe
    深度学习开源框架众多,基于C++的训练框架唯有Caffe一个,尽管Caffe在做一些比较新的任务时成本极高,但它依旧有它存在的价值,今天在这里给出几个推荐理由。作者&编辑|言有三1......
  • org.springframework.web.bind.ServletRequestDataBinde
    org.springframework.validationClassDataBinder​​java.lang.Object​​org.springframework.validation.DataBinderAllImplementedInterfaces:​​PropertyEditorRe......