C++ 并发编程指南(11)原子操作 | 11.4、通过内存序实现顺序模型
文章目录
- 一、通过内存序实现顺序模型
- 1、Relaxed Ordering
- 2、Sequencial Consistent Ordering
- 3、Acquire Release Ordering
前言
前文介绍了六种内存顺序,以及三种内存模型,本文通过代码示例讲解六种内存顺序使用方法,并实现相应的内存模型。
一、通过内存序实现顺序模型
1、Relaxed Ordering
memory_order_relaxed表示“最宽松的内存序”,不提供任何同步保证。具体来说,memory_order_relaxed仅保证原子操作本身是原子的,但不保证操作之间的顺序。
在
memory_order_relaxed的语义下,编译器和处理器可能会对原子操作进行重排序,以提高性能。在多线程环境中,使用memory_order_relaxed的原子操作可能会产生不可预测的结果,因为线程之间的操作顺序可能会因为重排序而发生变化。例如:
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)) { // 3std::cout << "y load false" << std::endl;}if (x.load(std::memory_order_relaxed)) { //4++z;}
}void TestOrderRelaxed() {std::thread t1(write_x_then_y);std::thread t2(read_y_then_x);t1.join();t2.join();assert(z.load() != 0); // 5
}
在上面的程序中断言有可能被触发,线程A执行
write_x_then_y函数,线程B执行read_y_then_x函数。由于使用宽松内存序,操作1对应的指令可能重排到操作2对应的指令后面,此时,当线程A执行完操作2时,操作1还没有被执行,x对应的值还没有写入到内存(x=false、y=true)。线程2执行到操作3时,读到y为true退出循环,线程2看到的x的值为false时(可以从指令重排与缓存结构两个角度来理解),不会执行操作4,进而导致断言触发。
注意:虽然
memory_order_relaxed不提供同步保证,但它仍然可以用于某些不需要严格同步的场景。例如,在某些计数器或统计场景中,可以使用宽松内存序来提高性能,因为这些场景通常不需要严格的同步语义。
2、Sequencial Consistent Ordering
memory_order_seq_cst代表了顺序一致性(Sequentially Consistent)的内存模型。这种内存序提供了最严格的同步保证,它确保所有线程都将看到相同的操作顺序,并且所有原子操作都将按照程序顺序执行。
具体来说,当使用
memory_order_seq_cst进行原子操作时,编译器和处理器不会对这些操作进行任何形式的重排序,以确保在所有线程中看到的操作顺序是一致的。这种内存序适用于那些需要强一致性的场景,但也可能带来一定的性能开销。
使用
memory_order_seq_cst内存序,解决前面遇到的问题,如下:
void write_x_then_y() {x.store(true, std::memory_order_seq_cst); // 1y.store(true, std::memory_order_seq_cst); // 2
}void read_y_then_x() {while (!y.load(std::memory_order_seq_cst)) { // 3std::cout << "y load false" << std::endl;}if (x.load(std::memory_order_seq_cst)) { //4++z;}
}void TestOrderSeqCst() {std::thread t1(write_x_then_y);std::thread t2(read_y_then_x);t1.join();t2.join();assert(z.load() != 0); // 5
}
上面的代码x和y采用的是
memory_order_seq_cst,当线程2执行到操作3,读出来y的值为true时会退出循环。因为使用的是全局一致性模型,不会对指令顺序进行优化,操作1一定会在操作2前面执行,所以当y的值被修改成成true时(执行操作2),操作1一定被执行了,此时,在线程2看到的x的值为true,会执行操作4,进而断言不会被触发。
注意:实现 sequencial consistent 模型有一定的开销,现代 CPU 通常有多核,每个核心还有自己的缓存,为了做到全局顺序一致,每次写入操作都必须同步给其他核心。为了减少性能开销,如果不需要全局顺序一致,应该考虑使用更加宽松的顺序模型。
3、Acquire Release Ordering
Acquire Release Ordering模型中,会使用memory_order_acquire、memory_order_release和memory_order_acq_rel这三种内存顺序,具体用法如下:
memory_order_acquire:原子变量的load操作可以使用,称为acquire操作memory_order_release:原子变量的store操作可以使用,称为release操作memory_order_acq_rel:read-modify-write 操作即读 (load) 又写 (store),可以使用memory_order_acquire、memory_order_release和memory_order_acq_rel。如果使用memory_order_acquire则作为acquire操作;如果使用memory_order_release,则作为release操作;如果使用memory_order_acq_rel,则同时为两者
Acquire-release可以实现synchronizes-with关系(该关系的解释可以参考11.5章节),可以通过Acquire-release修正TestOrderRelaxed函数以达到同步的效果,如下:
void TestReleaseAcquire() {std::atomic<bool> rx, ry;std::thread t1([&]() {rx.store(true, std::memory_order_relaxed); // 1ry.store(true, std::memory_order_release); // 2});std::thread t2([&]() {while (!ry.load(std::memory_order_acquire)); //3assert(rx.load(std::memory_order_relaxed)); //4});t1.join();t2.join();
}
采用
Acquire-release模型,操作3与操作2构成synchronizes-with关系,操作2的结果对操作3可见。当操作3读取到y的值为true时,说明操作2一定被执行了,操作2使用的是memory_order_release内存序,操作1指令不会被优化到操作2后面(参考11.3对memory_order_release内存序的介绍),操作2执行了,那么操作1也一定会被执行,线程2此时读到y=true、x=true,操作4一定会被执行,断言不会被触发。
相关文章:
C++ 并发编程指南(11)原子操作 | 11.4、通过内存序实现顺序模型
文章目录 一、通过内存序实现顺序模型1、Relaxed Ordering2、Sequencial Consistent Ordering3、Acquire Release Ordering 前言 前文介绍了六种内存顺序,以及三种内存模型,本文通过代码示例讲解六种内存顺序使用方法,并实现相应的内存模型。…...
【数据结构】栈和队列专题
前言 上篇博客我们讨论了栈和队列的有关结构,本篇博客我们继续来讨论有关栈和队列习题 这些题算是经典了 💓 个人主页:小张同学zkf ⏩ 文章专栏:数据结构 若有问题 评论区见📝 🎉欢迎大家点赞👍…...
2024年程序员最应该关注的几件事?
对于程序员而言,技术和行业趋势的演变是持续关注的焦点。以下是几件2024年程序员应该关注的事情: 持续学习新技术:技术领域的快速变化要求程序员不断更新自己的技能集,包括编程语言、框架、工具和最佳实践。 人工智能与机器学习&…...
【初阶数据结构】单链表基础OJ题讲解
前言 📚作者简介:爱编程的小马,正在学习C/C,Linux及MySQL。 📚本文收录与初阶数据结构系列,本专栏主要是针对时间、空间复杂度,顺序表和链表、栈和队列、二叉树以及各类排序算法,持…...
基于Java的俄罗斯方块游戏的设计与实现
关于俄罗斯方块项目源码.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89300281 基于Java的俄罗斯方块游戏的设计与实现 摘 要 俄罗斯方块是一款风靡全球,从一开始到现在都一直经久不衰的电脑、手机、掌上游戏机产品,是一款游戏规则简单…...
Hadoop 3.4.0+HBase2.5.8+ZooKeeper3.8.4+Hive+Sqoop 分布式高可用集群部署安装 大数据系列二
创建服务器,参考 虚拟机创建服务器 节点名字节点IP系统版本master11192.168.50.11centos 8.5slave12192.168.50.12centos 8.5slave13192.168.50.13centos 8.5 1 下载组件 Hadoop:官网地址 Hbase:官网地址 ZooKeeper:官网下载 Hive:官网下载 Sqoop:官网下载 为方便同学…...
umi搭建react项目
UMI 是一个基于 React 的可扩展企业级前端应用框架,提供路由、状态管理、构建和部署等功能,可以帮助开发者快速构建复杂的单页面应用(SPA)和多页面应用(MPA)。它与 React 的关系是,UMI 构建在 R…...
mybatis-plus之数据源切换事务失效问题
为什么存在数据源切换和食物时效问题? 由于业务数据来源不同 需要配置多个数据源来进行数据的查询 编辑等操作 这一切换业务对数据的一致性要求很高那就要保证ACID啦 也就是数据的有效性 要么是成功的 要么是失败的。 数据源切换采用mybatisplus支持 多数据源配置&a…...
vue 百度地图点击marker修改marker图片,其他marker图片不变。
解决思路,就是直接替换对应marker的图片。获取marker对象判断点击的marker替换成新图片,上一个被点击的就替换成老图片。 marker.name tag;marker.id i; //一定要设置id,我这里是设置的循环key值,要唯一性。map.addOverlay(mark…...
【Javaer学习Python】 1、Django安装
安装 Python 和 PyCharm 的方法就略过了,附一个有效激活PyCharm的链接:https://www.quanxiaoha.com/pycharm-pojie/pycharm-pojie-20241.html 1、安装Django # 安装Django pip install Django# 查看当前版本 python -m django --version 5.0.62、创建项…...
SSL协议
SSL 安全传输协议(安全套接层) 也叫TLS ---- 传输层安全协议 SSL的工作原理:SSL协议因为是基于TCP协议工作的,通信双方需要先建立TCP会话。因为SSL协议需要进行安全保证,需要协商安全参数,所以也需要建立…...
什么情况下会造成索引失效?
2.3.4. 索引失效 对索引使用左或者左右模糊匹配 使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx% 这两种方式都会造成索引失效。但是如果前缀是确定的那么就可以使用到索引,例如 name like 许%。 因为索引 B 树是按照「索引值」有序排列…...
间隔采样视频的代码
项目统计模型准确率 项目会保存大量视频,为了统计模型的精度,我们想要十五分钟抽取一个视频用来统计。 import os import shutil from datetime import datetime, timedelta #抽取视频的代码,会在每个小时的0分、15分、30分、45分取一个命名…...
C++ QT设计模式 (第二版)
第3章 Qt简介 3.2 Qt核心模块 Qt是一个大库,由数个较小的库或者模块组成,最为常见的如下:core、gui、xml、sql、phonon、webkit,除了core和gui,这些模块都需要在qmake的工程文件中启用 QTextStream 流,Qdat…...
【经验总结】超算互联网服务器 transformers 加载本地模型
1. 背景 使用 超算互联网 的云服务,不能连接外网,只能把模型下载到本地,再上传上去到云服务。 2. 模型下载 在 模型中 https://huggingface.co/models 找到所需的模型后 点击下载 config.json pytorch_model.bin vocab.txt 3. 上传模型文…...
ubuntu编译pcl时报错
报错如下 cc1plus: warning: -Wabi wont warn about anything [-Wabi] cc1plus: note: -Wabi warns about differences from the most up-to-date ABI, which is also used by default cc1plus: note: use e.g. -Wabi11 to warn about changes from GCC 7 在网上找到了一封邮件…...
Rust中的单元测试
概述 Rust内置了单元测试的支持,这点和Golang一样,非常的棒,我超级喜欢单元测试!!! 本节课的代码还是基于之前的求公约数的案例。 之前的完整代码如下: fn gcd(mut n: u64, mut m: u64) ->…...
ubuntu18.04系统安装pangolin
1. 安装pangolin依赖项 ctrlaltt 打开终端,依次输入下面的命令 sudo apt update sudo apt upgrade sudo apt install libglew-dev cmake libboost-dev libboost-thread-dev libboost-filesystem-dev libeigen3-dev -y 2.在终端中输入下面的命令,克隆…...
洛谷P10397题解
题目描述 给定一条 std::freopen 语句,输出其操作的文件名称。 形式化地,std::freopen 语句都应该恰好是 std::freopen("<title>","<mode>",<stream>);其中 <title> 为其操作的文件名称。其至少包含一个…...
【Linux】自动化编译工具——make/makefile(超细图例详解!!)
目录 一、前言 二、make / Makefile背景介绍 🥝Makefile是干什么的? 🍇make又是什么? 三、demo实现【见见猪跑🐖】 四、依赖关系与依赖方法 1、概念理清 2、感性理解【父与子👨】 3、深层理解【程序…...
解锁SD-PPP:将AI绘画能力无缝融入Photoshop工作流
解锁SD-PPP:将AI绘画能力无缝融入Photoshop工作流 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp 你是否曾经在Photoshop中创作时,突然需要一个AI生成的元素来完善设计,却不得不…...
终极指南:3分钟解决微信网页版无法访问的难题
终极指南:3分钟解决微信网页版无法访问的难题 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为微信网页版无法访问而烦恼吗ÿ…...
tars 环境安装及开发部署
参考:https://tarscloud.github.io/TarsDocs/installation/source-windows.html 安装环境 安装nodejs、vs(已安装了vs2022)、cmake(已安装,版本是3.30.0)、git(已安装,版本是2.45.2)、Mysql 下载并安装nodejs https://nodejs.org/en/ 版本是22.15.0 添加到环…...
传奇3手游网站下载 元素搭配攻略 新手快速上手复古服
官方出版资质:传奇3光通版手游由传奇3G原班人马打造,出版单位华东师范大学电子音像出版社有限公司,审批文号新广出审〔2016〕2183号,出版物号ISBN978-7-7979-0843-6,运营主体安徽游昕网络科技有限公司,官网…...
从Simulink模型到S32K3xx芯片:手把手教你玩转NXP官方MBD工具包(v1.4实战)
从Simulink模型到S32K3xx芯片:手把手教你玩转NXP官方MBD工具包(v1.4实战) 在汽车电子开发领域,时间就是竞争力。当传统手写代码遇上复杂的汽车MCU外设配置,工程师们常常陷入寄存器手册的海洋。而基于模型的设计&#x…...
音视频开发避坑:YUV420P图像处理时Stride不对齐,你的内存拷贝为啥总出错?
音视频开发避坑:YUV420P图像处理时Stride不对齐,你的内存拷贝为啥总出错? 在音视频开发中,YUV420P格式因其高效的存储方式被广泛使用,但许多开发者在处理这类图像时,常常会遇到内存拷贝错误、程序崩溃或画面…...
ADF4350频点锁定与电源滤波实战:为什么你的VCO输出有噪声?加个钽电容试试!
ADF4350频点锁定与电源滤波实战:为什么你的VCO输出有噪声?加个钽电容试试! 在射频电路设计中,ADF4350作为一款集成VCO的宽带频率合成器,因其出色的性能和灵活性广受工程师青睐。然而,许多开发者在实际应用中…...
nuScenes数据集“平替”指南:Mini版够用吗?完整版、Test版到底怎么选?
nuScenes数据集选型实战指南:从Mini版到完整版的决策逻辑 第一次接触nuScenes数据集时,面对动辄几百GB的庞然大物和仅有3.9GB的mini版本,相信不少研究者都会陷入选择困难。这就像站在自助餐厅里,既想品尝所有美味,又担…...
3步解锁iOS应用自由:AltStore免越狱安装终极指南
3步解锁iOS应用自由:AltStore免越狱安装终极指南 【免费下载链接】AltStore AltStore is an alternative app store for non-jailbroken iOS devices. 项目地址: https://gitcode.com/gh_mirrors/al/AltStore 还在为iOS设备上无法自由安装应用而烦恼吗&#…...
TeamPass后台任务管理:自动化维护和清理操作手册
TeamPass后台任务管理:自动化维护和清理操作手册 【免费下载链接】TeamPass Collaborative Passwords Manager 项目地址: https://gitcode.com/gh_mirrors/te/TeamPass TeamPass作为一款协作密码管理器,其后台任务管理功能是确保系统高效稳定运行…...
