引言

在C++多线程 内存序系列文章中,已经介绍了如下三种内存序

C++11多线程 内存序(std::memory_order_seq_cst )

C++11多线程 内存序(std::memory_order_acquire/release)

C++11多线程 内存序(std::memory_order_relaxed)

为了保持该系列文章的完整性,因此增加std::memory_order_consume的介绍。

std::memory_order_consume仅仅只用来补充该系列的完整性,在实际代码中不能使用该内存序,且在GCC中会自动将该内存序转换为std::memory_order_acquire。参考至Fixing GCC's Implementation of memory_order_consume

data dependency介绍

要理解和使用std::memory_order_consume,需要先理解什么是data dependency。在C++中data dependency可分为如下两种:

carries-a-dependency-to: if the result of operation A is used as an operand in operation B, then: A carries-a-dependency-to B.

dependency-ordered-before: a store operation (with std::memory_order_release, std::memory_order_acq_rel, or std::memory_order_seq_cst) is dependency-ordered-before a load operation B (with std::memory_order_consume) if the result of load operation B is used in a further operation C in the same thread. It is important to note that operations B and C have to be in the same thread.

关于上述两种解释可参考下图

dependency-ordered-before需要应用在线程间,上图中A进行Store操作happens-before B进行的load操作,且B操作carries-a-dependency-to C操作,因此由于可传递性,A happens-before  C。

std::memory_order_consume代码示例

该代码均来自于《Concurrency in Action C++》相应章节。

注:std::memory_order_consume具有弱的同步和内存序限制,即不会像std::memory_order_release产生同步与关系。

具体可参考如下代码:


#include <atomic>
#include <cassert>
#include <string>
#include <thread>struct X {int i_;std::string s_;
};std::atomic<int> a;
std::atomic<X*> p;void create_x() {X* x = new X;x->i_ = 42;x->s_ = "hello";a.store(99, std::memory_order_relaxed);p.store(x, std::memory_order_release);
}void use_x() {X* x;while (!(x = p.load(std::memory_order_consume)));assert(x->i_ == 42);assert(x->s_ == "hello");assert(a.load(std::memory_order_relaxed) == 99);}int main() {std::thread t1(create_x);std::thread t2(use_x);t1.join();t2.join();return 0;
}

上述代码中,use_x中assert(a.load(std::memory_order_relaxed)==99) 可能触发断言。

原因为:

x通过std::memory_order_consume所得,由data dependency介绍部分知,操作p.store(x, std::memory_order_release) dependency-ordered-before 语句while (!(x = p.load(std::memory_order_consume))),而该语句又carries-a-dependency-to *x,因此针对use_x中前两个assert均不会失败。

由于std::memory_order_consume具有弱的同步关系,因此无法保证a的值为99,故触发断言。

总结

至此,关于C++多线程 内存序相关文章总结完成。为了完善C++多线程内存序相关工作,后续会讲解 release sequence以及fence相关的内容。

C++11多线程 内存序(std::memory_order_consume)相关推荐

  1. c++ 11 多线程支持 (std::packaged_task)

    定义于头文件 <future> template< class > class packaged_task; // 不定义 (1) (C++11 起) template< ...

  2. C++11多线程 内存屏障(fence/atomic_thread_fence)

    目录 0 引言 1 fence基本概念 2 fence分类 3 示例代码 4 总结 0 引言 在前述文章中,我有针对C++11种的六种内存序(memory order)进行相应的讲解,其文章如下

  3. 算法移植优化(四)c++11 多线程

    c++11多线程库:std::thread 一.join函数:用于等待线程对象运行结束 程序从main函数开始,本来由一个线程执行:当执行到std::thread定义一个线程对象,给定初始构造函数后, ...

  4. C++11 多线程(std::thread)详解

    注:此教程以 Visual Studio 2019 Version 16.10.3 (MSVC 19.29.30038.1) 为标准,大多数内容参照cplusplus.com里的解释 此文章允许转载, ...

  5. 浅谈内存屏障,C++内存序与内存模型

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权. 文章目录 引言 一个有意思的问题 ...

  6. 聊聊内存模型和内存序

    本文始发于公众号[高性能架构探索],本公众号致力于分享干货.硬货以及工作上的bug分析,欢迎关注.回复[pdf]免费获取计算机经典书籍 你好,我是雨乐! 最近群里聊到了Memory Order相关知识 ...

  7. atomic 内存序_C++内存屏障(内存顺序)总结

    原子操作(atomic)是无锁编程(Lock-Free Programming)的基础.以往,要使用atomic操作,我们一般会使用gcc内置的原子操作接口,或者是基于指定平台硬件指令封装的atomi ...

  8. c++ 11 原子操作库 (std::atomic)(二)

    定义于头文件 <atomic> atomic 类模板及其针对布尔.整型和指针类型的特化 每个 std::atomic 模板的实例化和全特化定义一个原子类型.若一个线程写入原子对象,同时另一 ...

  9. 【转】C++11 并发指南五(std::condition_variable 详解)

    http://www.cnblogs.com/haippy/p/3252041.html 前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三 ...

最新文章

  1. TD321DCAN 隔离CAN总线驱动器
  2. 小白学统计(4)——数据集中趋势的描述
  3. 第三十二讲 ASP.NET网络打印
  4. IOS之代理的使用(重点)
  5. LeetCode MySQL 1890. 2020年最后一次登录(year)
  6. linux修改hostname
  7. java 代码块的意义_Java基础(9) - 静态、代码块
  8. 中石化shell_中石化壳牌(江苏)加油站百日攻坚创效分享
  9. MongoDB 数据迁移 备份 导入(自用)
  10. TripleDES加解密Java、C#、php通用代码
  11. Elasticsearch 分片和副本策略
  12. 题解报告——星际战争
  13. 如何实现WiFi下计算机互相访问,如何让两台笔记本电脑在无线连接下互相投屏...
  14. 浏览器怎么显示php文件夹,如何使用浏览器打开php文件?
  15. 生产安全事故应急预案
  16. The development history and future trend of optical fiber communication technology
  17. zookeeper 分布式barrier
  18. MOOC战德臣数据库课程自用笔记_7_函数依赖
  19. 信号调制与解调python
  20. 供应链管理问题会否导致小米在印度市场受挫?

热门文章

  1. set, setenv, export的区别
  2. 利用python爬取小说诡秘之主
  3. Android 听筒扬声器切换 并且监听音量变化
  4. PCIe | 基础知识点扫盲
  5. 科创人·派拉软件CEO谭翔:零信任本质是数字安全,To B也要深研用户心智
  6. 如何快速掌握一门技术(代码,软件)
  7. 鸿蒙系统为万物互联而生,鸿蒙系统发布:万物互联 EMUI10同台上场
  8. jacob java excel_12、借助Jacob实现Java打印报表(Excel、Word)
  9. antdesign 柱状图_010-ant design pro advanced 图表
  10. Ueditor去掉图片之间的间隙