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

跟我学C++中级篇—IRIW问题

一、IRIW问题的引入

在前面反复分析过内存序,但仍然会有小伙伴可能会想,既然最强的能解决所有问题,为什么不使用最强的。比如X86平台?松散的relaxed理解,但那个acq_rel和seq_cst都那么接近了,为什么还要分出一个acq_rel?它们的应用场景到底有什么具体的不同呢?这就不得不提到IRIW问题。

二、IRIW问题

IRIW,Independent Readers, Independent Writers即独立读,独立写入。它是并发编程中的内存模型测试的一个经典的场景。主要用来检测多处理器系统中内存模型的强弱情况。它能够检验在不同处理器(核心)上进行读操作时,是否会对两个不同位置的内存写入顺序保持一致。它是acq_rel失效测试的一个经典的反例。明白了它,也就明白了上面提出的问题。

三、分析

IRIW发生于多线程环境中,当设定的内存序为acquire-release时,不同的线程对多个独立原子变量进行读写操作时,可能出现不同线程对不同原子变量的观察顺序不一致的现象。下面看一个具体的例子:
假设有四个并发线程,T1,T2,T3和T4,有两个共享原子变量x,y,其初始值为0。其中:

  1. T1线程对x写入1
  2. T2线程对y写入1
  3. T3线程先读取x再读取y,即r1=x,r2=y
  4. T4线程先读取y再读取x,即r3=y,r4=x
    在这种情况,T3和T4读取的结果会是什么情况?有没有可能出现下列情况:
  5. 线程T3中的r1 = 1,r2 = 0;即x的写入被看到但y的写入未看到。
  6. 线程T4中的r3 = 1,r4 = 0;即y的写入被看到但x的写入未看到。
    从结果来看,这种情况是完全相反的结果。这就会导致在多线程开发环境中,数据结果的不一致,进而产生各种问题。
    其实对于内存序为acquire-release,它只能保证对单个原子变量操作时的顺序,对多个则无法保证。也就是说,如果发生了上面的结果,那么,就产生了IRIW问题或者说IRIW的重排序问题。
    出现IRIW的问题,本质的原因在于内存模型的设定,C++的内存模型允许不同的原子变量在操作上存在着相对独立的执行顺序(编译器乱序等),目的只有一个,提高性能。不能因为过强的顺序一致性导致CPU执行的流水被打断。
    C++的内存模型也是如此,它引入了乱序执行来提高流水线的执行效率,但这也导致在acq_rel的内存序下多原子变量的约束风险。
    所以在这种情况下,如果引入seq_cst(强制所有线程对所有的原子变量操作进行全局的排序),虽然性能降低了,但结果保持了一致。说的直白一些,通过上面的例子和分析,就可以更明显的体会C++设计者如何在性能与数据一致性作出的努力。

四、说明

IRIW问题说明,可以看作是对内存模型强弱的一种测试方式。正如前面所讲,在X86平台上由于强顺序一致性的设定,IRIW问题是可以被忽略的。这其实也是大多数开发者忽略这个问题的一个主要原因。但在其它一些平台上,如ARM或PowerPC上,它们是很有可能出现IRIW问题的,这其实也是此类平台为追求性能所作出的一些取舍。
弄明白IRIW问题,对真正想理解高并发编程的开发者来说,是一个非常好的实验场景,可以让开发者能够把并发和底层控制具象化的统一起来。从而更好的理解和认识并发编程的底层机制和上层影响。

五、总结

IRIW问题是一种经典的区分C++内存模型中seq_cst和acq_rel内存序的例子。从这个问题中,可以让开发者清晰的理解并发编程中,C++为追求性能与安全的平衡所进行的不同粒度的底层控制。它给所有开发者提醒,高并发编程,不是一个简单的问题。

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

相关文章:

  • 5分钟快速修复Windows更新故障:Reset Windows Update Tool完全指南
  • Get cookies.txt LOCALLY终极指南:安全本地Cookie管理的完整教程
  • 千问3.5-2B应用场景:农业病虫害图识别、地质勘探图解、气象卫星图理解
  • 基于Matlab/Simulink的卡尔曼滤波及扩展卡尔曼滤波SOC仿真测试
  • Trae更新后使用AI功能一直显示正在分析问题解决方法【已解决】
  • 基于双层优化的微电网系统规划容量配置方法 参考文献:基于双层优化的微电网系统规划设计方法 非完全复献
  • 美胸-年美-造相Z-Turbo与Anaconda环境配置指南
  • 如何快速上手NSC_BUILDER:Switch游戏文件管理的终极解决方案
  • KingbaseES V008R006C008B0014物理备份实战:sys_rman从配置到自动化的完整避坑指南
  • wan2.1-vae开源生态整合:对接ComfyUI节点、支持ControlNet条件控制与IP-Adapter扩展
  • 突破消息撤回限制:RevokeMsgPatcher 掌控你的聊天记录
  • 5个技巧搞定设备伪装方案:SafetyNet绕过与Magisk模块配置指南
  • ChatGLM3-6B新手体验:Streamlit界面操作简单,模型即开即聊
  • 无线充电LCC-S的Simulink仿真模型:48V输入、1000W输出,适用于智能车竞赛微缩...
  • 声音触发器。用于自动化场景检测器
  • 北斗高精度数据解算:破解城市峡谷/长基线/无网区难题,从毫米级定位到自动化交付——(GAMIT/GLOBK底层核心解算技术方法)
  • 忍者像素绘卷效果实测:云端画布UI在微信小程序WebView渲染性能
  • LeetCode HOT100 - 买卖股票的最佳时机含冷冻期
  • ROS2编译报错CMake未找到diagnostic_updater:从诊断工具缺失到精准安装
  • Phi-4-mini-reasoning保姆级教程:模型量化INT4部署可行性实测
  • 别再手动调了!用Visio这个隐藏的字体设置窗口,一键切换泳道图标题横竖排
  • Pixel Language Portal保姆级教程:Hunyuan-MT-7B自定义词典注入+像素UI术语高亮配置
  • comsol 拓扑优化,流动传热拓扑优化,流固耦合拓扑优化。 伴随拓扑优化提供matlab和p...
  • 艾奇GEO:跨境企业AI搜索没海外流量?5大底层逻辑破解获客困局 - 小白条111
  • Youtu-Parsing模型C盘空间优化部署:清理与迁移实战指南
  • 汽修店数字化转型的“最优解”:聚泰汽修管理软件深度解析
  • 转行Agent,学什么程度才能拿到offer
  • Qwen-Image-Edit解决修图难题:去除水印、更换风格、智能美化一键完成
  • GOTS有机认证为何能称为纺织品领域的“金字招牌”
  • 我是自动化程序的博客