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

理解原子变量之三:原子性与memory_order_relaxed

目录

CPU与内存的关系

原子性

典型使用场景


在本系列的第一篇文章理解原子变量之一:从互斥锁到原子变量,最粗浅的认识_原子互斥-CSDN博客,我通过几个实例从感性认识的角度介绍了原子性。本文在第一篇文章的基础上,从理性认识的角度进一步讲述原子性的含义。下一篇文章将详细描述可见性。

CPU与内存的关系

现代的CPU一般都是多核(core)CPU,CPU与内存的关系如下图所示。下面的图来自大白话C++之:一文搞懂C++多线程内存模型(Memory Order)_c++ memory order-CSDN博客

原子性

可见,CPU通常不会直接对主内存(RAM)进行读写,因为CPU的核(core)与RAM之间隔了几级的缓存(cache),以及寄存器。
假如内存里有一个变量a,cpu给该变量+1的过程可能是这样的:先把新的值写入cache,然后把cache的内容写入ram。可见,这个写入过程可能不是一步完成的。假如在这个过程里,另一个cpu的core也要操作a++,那么两个线程之间就可能发生访问冲突。理想情况下,既然两个线程分别要给a+1,那么最后a的结果应该+2才对。但是最后a的结果可能没有+2,而是仅仅+1.这便是对原子性的破坏。
在std::memory_order - cppreference.com有一段对memory_order_relaxed功能的描述:

仅对此操作要求原子性

这里,任何遵守原子性的操作,都保证本操作是不可分割的,即在执行遵守原子性的操作,不能被在中途被其他操作插入干预。这也是std::memory_order的6个内存序都必须满足的要求,当然也就是原子操作的最低要求。

在前一篇文章理解原子变量之二:从volatile到内存序-进一步的认识-CSDN博客里,我提到了原子变量的功能分为三部分:原子性、可见性和限制指令重排。memory_order_relaxed仅具备原子性,不保证可见性和限制指令重排,所以它是6种内存序里面最弱的内存序

典型使用场景

store操作与fetch_add操作是运用memory_order_relaxed的典型场景。既然fetch_add遵守memory_order_relaxed次序,则取数据,再加上,然后储存回去就是一套不可分割的连贯动作。见std::memory_order - cppreference.com

下一篇文章将结合另外两个内存序memory_order_acquire与 memory_order_release描述可见性。

http://www.jsqmd.com/news/1130564/

相关文章:

  • 传统工具 vs Slidev 对比
  • YOLOv5 火焰识别实战:1421张数据集训练,mAP@0.5 达 0.89(附完整代码)
  • SmartTube完整教程:3步在Android TV上安装无广告YouTube客户端
  • 无需Root!三步法让安卓手机告别臃肿,快速提升隐私与续航的终极方案
  • CCHMapClusterController高级技巧:动态聚类控制与多组聚类管理
  • 【 LM358AD方波】2024-12-31
  • Buildout PYTHONPATH接管机制导致子进程模块导入失败
  • Word2Bits预训练模型下载与应用:800维1位量化向量高效部署指南
  • Sync源码解析:深入理解Erlang自动重载工具的架构设计
  • 从零实现Google OAuth 2.0登录:Node.js后端集成与安全实践
  • Git删除文件安全指南:从暂存区清理到历史重写
  • Twitter API Client测试策略:单元测试与集成测试完整指南
  • twitter-api-php测试策略:使用PHPUnit进行API集成测试
  • 解决CSM联机延迟:提升《城市:天际线》多人游戏体验的10个实用技巧
  • SageMaker Studio Lab部署指南:将训练好的模型无缝集成到AWS服务
  • icanhazproxy.com使用指南:如何快速检测与分析HTTP代理头信息
  • 如何快速上手intellij-erlang?5分钟完成Erlang IDE搭建指南
  • Wexflow安全部署指南:保护你的自动化流程免受攻击
  • 3分钟掌握Android投屏神器:scrcpy让手机屏幕完美显示在电脑上
  • AcDisplay Xposed模块开发:如何扩展Android系统级通知功能
  • 5步掌握GTA5最强修改器:YimMenu终极使用指南
  • CANN/asc-devkit多核矩阵乘法临时缓冲区大小获取
  • 革命性开源天气API:Open-Meteo如何重塑全球气象数据访问
  • 零代码革命:如何用MIT App Inventor在3天内开发出你的第一个移动应用?
  • 如何利用MONAI解决医疗影像AI开发中的核心挑战:模块化设计与实战应用
  • 3步解锁PPT科研演示效率:SlideSCI插件终极解决方案
  • AssetRipper终极指南:如何快速提取Unity游戏资源并转换为可编辑格式
  • 从游戏模组到开发平台:REPENTOGON如何重新定义《以撒的结合》模组生态
  • 2026年论文降AI保姆级教程:亲测5款好用的降AI率平台,教你从80%降至10%
  • Onekey Steam游戏解锁工具:免费快速解锁DLC的终极指南