当前位置: 首页 > news >正文

6、C++内存模型

原文: https://my.oschina.net/u/2516597/blog/805489

背景

C++11开始支持多线程,其中提供了原子类型atomic, 和atomic关系比较密切的是memory_order,所有的内存模型都是指atomic类型

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

具体

std::memory_order_relaxed

该模式仅仅保证了读写的完整性(不会读取到写一半的数据,要么是新值,要么是旧值),而且要求单个线程内的同样一个原子变量的各种操作顺序不能进行重排。

#include <atomic>
#include <thread>
#include <cassert>std::atomic<bool> x,y;
std::atomic<int> z;void write_x_then_y()
{x.store(true,std::memory_order_relaxed);  // 1y.store(true,std::memory_order_relaxed);  // 2
}
void read_y_then_x()
{while(!y.load(std::memory_order_relaxed));  // 3if(x.load(std::memory_order_relaxed))  // 4++z;
}
int main()
{x=false; //5y=false; //6z=0; //7std::thread a(write_x_then_y); //Astd::thread b(read_y_then_x);  //Ba.join();b.join();assert(z.load()!=0);  // 8return 0;
}

assert是仍然有可能触发的! 內存模型是std::memory_order_relaxed, 根据这个内存模型的说明,1,2处可能乱序,5,6和7也可能重拍乱序。所以在3和4处的read操做就可能即便y load到了true, 而x仍然load到false.

http://www.lryc.cn/news/97975.html

相关文章:

  • 上海市青少年算法2023年1月月赛(丙组)
  • 移动开发之Wifi列表获取功能
  • MyBatisPlus - 实体类 的 常用注解
  • vue3+ts+elementui-plus二次封装树形表格实现不同层级展开收起的功能
  • Qt之切换语言的方法(传统数组法与Qt语言家)
  • qt root start faild
  • 数据结构—串
  • hive 全量表、增量表、快照表、切片表和拉链表
  • 数据结构07:查找[C++][B树Btree]
  • 在CSDN学Golang云原生(Kubernetes集群管理)
  • WPF实战学习笔记18-优化设计TodoView
  • Python版day59
  • [SQL挖掘机] - 算术运算符
  • 机器学习基础 数据集、特征工程、特征预处理、特征选择 7.27
  • Sass 常用的功能!
  • chmod命令详细使用说明
  • ICC2如何计算Gate Count?
  • Qtday3作业
  • 全球程序员需要知道的50+网址,有多少你第一次听说?
  • Matlab中实现对一幅图上的局部区域进行放大
  • mysql-速成补充
  • 微信小程序,商城底部工具栏的实现
  • Lab———Git使用指北
  • ChatGPT的工作原理:从输入到输出
  • redis数据库与主从复制
  • js加载和长任务
  • 利用Stable diffusion Ai 制作艺术二维码超详细参数和教程
  • 【C语言课程设计】图书管理系统
  • 在 ArcGIS Pro 中使用 H3 创建蜂窝六边形
  • 创建Electron项目