IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++11多线程 内存序(std::memory_order_consume) -> 正文阅读

[C++知识库]C++11多线程 内存序(std::memory_order_consume)

引言

在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++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-13 11:17:51  更:2021-10-13 11:18:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:13:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码