1、std::memory_order_relaxed “自由”内存顺序

在原子类型上的操作以自由序列执行,没有任何同步关系,仅对此操作要求原子性。例如,在某一线程中,先写入A,再写入B。但是在多核处理器中观测到的顺序可能是先写入B,再写入A。自由内存顺序对于不同变量可以自由重排序。

这是因为不同的CPU缓存和内部缓冲区,在同样的存储空间中可以存储不同的值。对于非一致排序操作,线程没有必要去保证一致性。

上述代码,z.load()!=0有可能会返回false。在b线程中,多核处理器观测到的顺序是随机的。b线程中的观测到的变量的并不会与线程a中的变量做同步,没有任何顺序要求。

2、std::memory_order_release “释放”内存顺序

使用memory_order_release的原子操作,当前线程的读写操作都不能重排到此操作之后。例如,某一线程先写入A,再写入B,再以memeory_order_release操作写入C,再写入D。在多核处理器中观测到的顺序AB只能在C之前,不能出现C写入之后,A或B再写入的情况。但是,可能出现D重排到C之前的情况。

memory_order_release用于发布数据,放在写操作的最后。

3、std::memory_order_acquire “获取”内存顺序

使用memory_order_acquire的原子操作,当前线程的读写操作都不能重排到此操作之前。例如,某一线程先读取A,再读取B,再以memeory_order_acquire操作读取C,再读取D。在多核处理器中观测到的顺序D只能在C之前,不能出现先读取D,最后读取C的情况。但是,可能出现A或B重排到C之后的情况。

memory_order_acquire用于获取数据,放在读操作的最开始 。

上述代码是使用“释放-获取"模型对“自由”模型的改进。z.load() != 0 返回的一定是true。首先,a线程中,y使用memory_order_release释放内存顺序,在多核处理器观测到的顺序,x的赋值肯定会位于y之前。b线程中,y的获取操作是同步操作,x的访问顺序必定在y之后,观测到的x的访问值一定为true。

“获取”与“释放”一般会成对出现,用来同步线程。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

C 的 3种内存顺序,你都知道吗?相关推荐

  1. C 的 6 种内存顺序,你都知道吗?

    原子操作的内存顺序 有六个内存顺序选项可应用于对原子类型的操作: 1. memory_order_relaxed 2. memory_order_consume 3. memory_order_acq ...

  2. 处理器协同机制其三C++内存顺序与栅栏(及依赖性读屏障)

    目录 处理器协同机制其一缓存一致性协议(MESI) 处理器协同机制其二内存屏障与内存顺序(及Store Buffer与Invalidate Queue) 处理器协同机制其三C++内存顺序与栅栏(及依赖 ...

  3. 处理器协同机制其二内存屏障与内存顺序(及Store Buffer与Invalidate Queue)

    目录 处理器协同机制其一缓存一致性协议(MESI) 处理器协同机制其二内存屏障与内存顺序(及Store Buffer与Invalidate Queue) 处理器协同机制其三C++内存顺序与栅栏(及依赖 ...

  4. 两种内存池管理方法对比

    一.问题背景 最近在调试ambiq apollo3的蓝牙时,其使用了ARM Cordio WSF的蓝牙协议栈.通过学习wsf_buf.c的实现,看到了一种不同于固定大小内存块的内存池管理方式.它使用了 ...

  5. JVM的四种内存屏障

    文章目录 1.为什么要有内存屏障 2.硬件上面的内存屏障 3.Java里面的四种内存屏障 4.使用内存屏障保存Volatile的有序性 4.1 单线程下的指令重排序 4.1 多线程下的指令重排序 1. ...

  6. 深入理解C语言-二级指针三种内存模型

    二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别 第一种内存模型char *arr[] 若有如下定义 char *arr[] = {&quo ...

  7. 终端服务器有多种运行模式,云终端的三种工作模式你都知道的吗

    原标题:云终端的三种工作模式你都知道的吗 不知道大家有没有发现这几年来我们办公的电脑不知不觉中有笨重的台式机逐渐变成了小巧的云终端在使用的,我们去医院看病时也发现他们的办公的台式机也变成了云终端,甚至 ...

  8. CUDA下在Host端分配的几种内存模式

    CUDA下在Host端分配的几种内存模式 0条评论 2009-11-27 11:21   IT168网站原创 作者: 关鑫的博客 编辑: 覃里 [IT168 文档]Pageable VS Pinned ...

  9. c++内存管理-内存顺序

    转载自:https://www.dazhuanlan.com/2019/12/14/5df40323d6adf/ 原子操作(atomic)是无锁编程(Lock-Free Programming)的基础 ...

最新文章

  1. 学习java应该如何理解反射?
  2. iOS之NSAttributedString-------字符属性
  3. 数据结构与算法--9.常见时间复杂度及其之间的关系
  4. 信息安全系统设计基础第四次实验报告 201352012013530620135307
  5. JAVA设计模式(08):结构化-飞锤(Flyweight)
  6. Dalvik 与 ART 区别
  7. linux下安装rabbitmq以及在spring中进行集成
  8. pythonyield详解_yield详解
  9. 台达编码器型号含义_台达伺服电机命名规则
  10. 搭建个人gitlab服务器
  11. 英文网页翻译中文失败、QQ文件打不开、QQ系统消息打不开等
  12. ubuntu20.04不是所有者所以不能更改权限
  13. JAVA中Object类中的equal方法
  14. 我的老公-追忆似水流年
  15. 巴比特 | 元宇宙每日必读:企业需要具备哪些资质才能开展NFT相关业务?
  16. HTML--图片的插入
  17. 数据库开发技术复习题填空题
  18. 项目中项目评估概述及原则
  19. Elasticsearch学习2 SpringBoot整合 测试复杂检索
  20. springboot+dubbo+zookeeper详细搭建

热门文章

  1. 旧访客设计模式的新生活
  2. J2Pay –完整示例
  3. Java的终结器仍然存在
  4. superhot预告片下载_预告片:裸指关节SOA
  5. io和nio的缓冲_IO与NIO –中断,超时和缓冲区
  6. glassfish_具有GlassFish和一致性的高性能JPA –第3部分
  7. JAX-RS 2.x与Spring MVC:返回对象列表的XML表示
  8. Java EE,Docker和Maven(技术提示#89)
  9. 在Jersey 2中进行集成测试自定义验证约束
  10. 使用grep4j轻松测试分布式组件上的SLA