C++ 并发编程指南(11)原子操作 | 11.5、内存模型

文章目录

  • 一、C++ 内存模型
    • 1、为什么需要内存模型?
    • 2、happens-before和synchronize-with两个关键概念
      • 2.1、happens-before
      • 2.2、synchronize-with
      • 2.3、总结

前言

C++ 11标准中最重要的特性之一,是大多数程序员都不会关注的东西。它并不是新的语法特性,也不是新的类库功能,而是新的多线程感知内存模型。本文介绍的内存模型是指多线程编程方面,而非对象的内存布局与内存对齐之类。

一、C++ 内存模型

1、为什么需要内存模型?

要回答这个问题需要从CPU架构说起,下面是一个的多核CPU架构图,如下:

在这里插入图片描述

  • Core:每个Core独享SB与L1
  • SB(Store Buffer):Store Buffer是一个缓冲区,用于暂存CPU的写操作,它允许CPU把数据先写入Store Buffer,然后继续执行其他操作,而不是等待数据被写入缓存或内存后再进行下一步。这样设计的好处是显著降低了内存写延迟对CPU性能的影响。
  • L1 Cache:存储了CPU近期可能访问的数据和指令,且两个L1 Cache独享一个L2 Cache

注意:上面的CPU架构只是部分CPU采用的架构,并不能代表全部。

为什么需要使用Cache?

如果没有Cache,CPU每执行一条指令就要到内存中取数据。执行一条指令只需要几个时钟周期,而取指令需要上百个时钟周期,这就将导致CPU大部分时间都处于等待状态,进而导致执行效率低下,引入了Cache主要解决CPU等待问题。

使用Cache会引入一些新的问题,例如:Cache的一致性、Cache的缺失等,为了解决这些问题,各CPU平台(ARM/X86/IA64)都有自己的解决方案。软件层面(编译器)也会有对应的优化,这导致了CPU执行的程序并不是你写的那个版本,只是从结果上看不出差异而已。

编译器和CPU优化都遵循了一个同样的原则,即优化后的代码若是单线程执行,要与原有代码行为保持一致;再加之多线程环境我们使用的互斥锁,其对编译器与CPU优化做了很多限制,可以让我们对线程间的执行顺序进行同步,进而保证即使被优化成了另一个程序,仍然有相同的执行结果。

若是我们从比互斥锁更为底层地去了解线程间的同步机制,我们势必会看到CPU平台(ARM/X86)和编译器的差异,进而可以知道优化的存在。现代C++的内存模型,便是为了屏蔽这些差异,而让你可以不用去了解特定平台特定编译器,也不用依赖互斥锁,从更为底层的层面,就可以完成线程间的同步。C++ 11开始提供的std::atomic模版,便可以作为更为底层的同步工具,这也是内存模型起作用的地方。

2、happens-before和synchronize-with两个关键概念

在C++多线程编程中,确保不同线程之间的同步和数据一致性是至关重要的问题。为此,C++11及其后续版本引入了内存模型(Memory Model),其中包括了happens-before和synchronize-With两个关键概念。这两个概念帮助程序员理解多线程环境下操作的顺序和可见性,从而编写出正确且高效的并发代码。

2.1、happens-before

happens-before是C++内存模型中的一个核心概念,它定义了两个操作之间的偏序关系。如果一个操作A先行发生于另一个操作B(即A happens-before B),那么操作A的结果对操作B是可见的。这意味着操作B可以读取到操作A对共享数据的修改。在C++多线程环境中,happens-before关系可以通过多种方式建立,包括:

  • 顺序一致性:在同一线程中,按照代码的执行顺序,前面的操作自然Happens-Before于后面的操作。
  • 原子操作:原子操作(如std::atomic类型的操作)本身具有Happens-Before关系。对原子变量的写入操作Happens-Before于后续对同一变量的读取操作。
  • 互斥锁:使用互斥锁(如std::mutex)保护的代码块之间也存在Happens-Before关系。解锁操作Happens-Before于随后的加锁操作,确保了临界区内的操作对其他线程可见。
  • 条件变量:条件变量(如std::condition_variable)的等待和通知操作也遵循Happens-Before规则。通知操作Happens-Before于等待操作的返回,确保了通知状态的正确传播。

通过利用这些happens-before关系,程序员可以确保线程间的数据一致性和操作的顺序性。

2.2、synchronize-with

synchronize-with是C++多线程中另一个重要的概念,它关注于特定同步操作之间的关系。当两个线程通过某种同步机制(如互斥锁、条件变量或原子操作)进行交互时,它们之间的操作会形成synchronize-with关系。

具体来说,如果一个线程A释放了一个锁或修改了一个原子变量,并且随后线程B获取了同一个锁或读取了同一个原子变量,那么线程A的操作synchronize-with线程B的操作。这意味着线程A中所有对共享数据的修改对线程B都是可见的。

synchronize-with关系提供了一种更细粒度的控制,它允许程序员精确地指定哪些操作需要在多线程环境中保持同步和可见。通过合理地使用同步机制,程序员可以确保线程之间的正确交互和数据一致性。

2.3、总结

在C++多线程编程中,happens-before和synchronize-with是两个核心概念,它们共同构成了C++内存模型的基础。通过理解和利用这些概念,程序员可以编写出高效且正确的并发代码,确保线程间的同步和数据一致性。在实际应用中,程序员应该根据具体的需求和场景选择合适的同步机制,并遵循内存模型的规则,以确保多线程程序的正确性和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/565500.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统思考—业务复盘

今日的JSTO——《业务复盘》中,赵海懿老师的分享启发了我深度反思。她提到的两句话特别引人思考: 1、学校里学到的最重要的东西,就是“最重要的东西在学校里学不到”。 2、学习型组织不只是组织学习。 这些话提醒我们,真正的学习…

区块链钱包开发指南: 探究区块链钱包开发涉及

区块链钱包是连接用户与区块链网络的重要工具,它们不仅提供了安全的存储和管理数字资产的功能,还允许用户进行交易和与区块链上的智能合约进行互动。本文将探究区块链钱包开发涉及的关键方面和技术要点。 1. 区块链钱包类型 区块链钱包可以分为以下几种…

Unity中的UI系统之UGUI

目录 概述UGUI基础——六大基础组件六大基础组件概述Canvas画布组件CanvasScaler画布缩放控制器组件必备知识恒定像素模式缩放模式恒定物理模式3D模式 Graphic Raycaster图形射线投射器EventSystem和Standalone Input ModuleRectTransform UGUI基础——三大基础控件Image图像控…

JS - 以工厂模式和原型模式方式建造对象、JS的垃级回收机制、数组的使用

创建对象的方式 使用工厂方法来建造对象 在JS中我们可以通过以下方式进行创建对象: var obj {name:"孙悟空",age:18,gender:"男",sayName:function(){alert(this.name);}};var obj2 {name:"猪八戒",age:28,gender:"男",…

【第4讲】XTuner 微调 LLM:1.8B、多模态、Agent

目录 1 简介2 基础知识2.1 finetune简介2.2 xtuner简介2.2.1 技术架构2.2.2 快速上手xtuner 2.3 8GB显存玩转LLM(intern1.8b)2.3.1 flash attention vs deepspeed zero2.3.2 相关版本更新和使用 2.4 多模态LLM2.4.1 多模态LLaVA基本原理简介2.4.2 快速上…

Linux的学习之路:18、进程间通信(2)

摘要 本章主要是说一下命名管道和共享内存 目录 摘要 一、命名管道 1、创建一个命名管道 2、匿名管道与命名管道的区别 3、命名管道的打开规则 4、代码实现 二、system V共享内存 1、共享内存 2、共享内存函数 三、代码 四、思维导图 一、命名管道 1、创建一个命…

24年做抖店,如何快速脱离“商家新手期”?

我是王路飞。 这个“新手期”不是你们理解的那种店铺新手期,现在抖店没有新手期这一说了。 主要说的是从商家角度来说,如何在最短时间内从一个没有电商经验的新手,蜕变成一个有经验、有流程、有操作、甚至有一定数据的“老玩家”&#xff1…

CentOS7配置固定ip

一、打开配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 二、更改配置文件的参数 将BOOTPROTO的属性值改为static 或者是直接注销原来的重新写更改为静态的 三、在配置文件中设置ip地址和网关 1、IP地址的前三段需要和主机的 VMnet8 网卡的ip保持一致(主…

js 打印网页时没有背景色,window.print打印背景色丢失

页面效果 打印效果 需要在打印的容器里增加下面代码 /*webkit 为Google Chrome、Safari等浏览器内核*/ -webkit-print-color-adjust: exact; /*解决火狐浏览器打印*/ print-color-adjust: exact; color-adjust: exact; 完整写法 我为了方便直接写*,这样所有元素都…

IDEA 2024.1 配置 AspectJ环境

最近Java课设在学习AspectJ,做PPT顺便写一个博客 下载包 首先去AspectJ官网下载一个JAR包并安装 安装完最后可以按照他的建议配置一下 然后找到AspectJ的安装位置的lib目录,把三个包拷到自己项目中的lib目录下 由于最新版的IDEA已经不支持AspectJ了 所…

【Linux】在ubuntu快速搭建部署K8S(1.27)集群

ubuntu快速安装K8s1.27 (一)环境说明1.硬件环境2.Ubuntu环境设置 (二)安装配置containerd1.安装2.配置3.启动 (三)所有节点操作1.安装runc和cni2.节点系统设置、关闭临时分区3.修改内核参数4.安装 kubeadm、…

新手小白,在数学建模的过程中应该怎么分工?

大家知道,数学建模竞赛是需要一个团队的三个人在三天或四天的时间内,完成模型建立,编程实现和论文写作的任务,对许多第一次参加建模或者建模经验比较欠缺的团队来说,是时间紧任务重的,那么怎么办呢&#xf…

EelasticSearch的介绍和基于docker安装

1.概述 Elasticsearch 是一个基于 Apache Lucene 构建的开源分布式搜索引擎和分析引擎。它专为云计算环境设计,提供了一个分布式的、高可用的实时分析和搜索平台。Elasticsearch 可以处理大量数据,并且具备横向扩展能力,能够通过增加更多的硬…

程序设计语言—Python几种语言区别的总结

程序设计语言篇—Python&几种语言区别的总结 文章目录 程序设计语言篇—Python&几种语言区别的总结一、Python介绍&理解1.1 Python基础1.2 Python规范 二、标识符&变量&常量三、数据类型&运算符和表达式3.1 数据类型3.2 运算符&表达式 四、常用的函…

真实世界的密码学(三)

原文:annas-archive.org/md5/655c944001312f47533514408a1a919a 译者:飞龙 协议:CC BY-NC-SA 4.0 第十一章:用户认证 本章涵盖了 认证人员和数据之间的区别 用户认证,根据密码或密钥对用户进行身份验证。 用户辅助认…

光伏仿真设计需要用到的工具有哪些?

随着全球能源结构的转型和可持续发展战略的深入实施,光伏发电作为一种清洁、可再生的能源形式,正日益受到广泛关注和应用。在光伏系统的设计和优化过程中,光伏仿真设计工具发挥着至关重要的作用。那么,光伏仿真设计需要用到的工具…

书生·浦语大模型实战营之微调 Llama 3 实践与教程 (XTuner 版)

书生浦语大模型实战营之微调 Llama 3 实践与教程 (XTuner 版) Llama 3 近期重磅发布,发布了 8B 和 70B 参数量的模型,XTuner 团队对 Llama 3 微调进行了光速支持!!!开源同时社区中涌现了 Llama3-XTuner-CN 手把手教大家使用 XTuner 微调 Llama 3 模型。 XTuner:http:/…

【InternLM 实战营第二期笔记04】XTuner微调LLM:1.8B、多模态、Agent

一、微调的原因 大模型微调(Fine-tuning)的原因主要有以下几点: 适应特定任务:预训练的大模型往往是在大量通用数据上训练的,虽然具有强大的表示学习能力,但可能并不直接适用于特定的下游任务。通过微调&…

京东商品详情数据采集API接口|附京东商品数据返回PHP多语言高并发

京东获得JD商品详情 API 返回值说明 item_get-获得JD商品详情 API测试 注册开通 jd.item_get 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址…

接收区块链的CCF会议--SecureComm 2024 截止5.10 附录用率

会议名称:SecureComm CCF等级:CCF C类会议 类别:网络与信息安全 录用率:2022年录用率33%(43/130) Topics Security and privacy in computer networks (e.g., wired, wireless, mobile, hybrid, sensor, vehicular,…