原子操作的原理和本质

C++11+ 原子操作 `std::atomic`,现代并发编程的核心 重排是理解内存序的核心基础。在计算机系统中,程序指令的实际执行顺序与程序员在源代码中编写的顺序不一致的现象就是你写在代码里的语句顺序。比如你先写变量A = 10;,然后再写B = 20;。就是 CPU 实际执行这些指令的顺序,或者这些指令的效果(特别是内存读写)对其他 CPU 核心可见的顺序。而重排则是指执行顺序没有严格按照程序代码顺序进行。重排不是错误,也不是随意的行为。它是现代计算机系统为了追求极致性能而进行的一系列复杂优化的必然结果。主要包括和。 阅读详情

本文重点:

概念:原子操作
内容:原子操作的本质和实现


基本概念:

分解概念:涉及的知识点
1、 并行和并发
2、 如何保证操作的原子性
3、 cache一致性
4、 原子操作的实现-软件
5、 原子操作的实现-硬件


详细解释:

1、 并行和并发

原子(atomic):是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。

并发:单核cpu上,当多个线程在在操作时,把cpu运行时间划分为若干时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其他线程处于挂起状态。

并行:多核cpu上,当一个核心处理器执行一个线程时,另一个核心处理器可以同时执行这个线程。

2、 如何保证操作的原子性

(1)使用总线锁保证原子性
(2)使用缓存锁保证原子性

3、 cache一致性
缓存一致性主要是通过MESI协议实现。
4、 原子操作的实现-软件
所谓的锁,本质上只是内存中的一个整形数,不同的数值表示不同的状态,比如1表示空闲状态和加锁状态。加锁时,判断锁是否空闲,如果空闲,修改为加锁状态,返回成功,如果已经上锁,返回失败,解锁时,就把锁状态修改为空闲状态。
我们可以把上锁的过程具体表示为:

  • 读内存表示锁的变量

  • 判断锁的状态

  • 如果已经加锁,返回失败

  • 否则把锁设置为上锁状态, 返回成功

    上面的每一个步骤都对应一条汇编语句,可以认为这每一步操作都是原子的,什么情况会导致两个线程同时获取到锁?
    中断: 当线程A执行完第一步后,发生了中断,os调度线程B,线程B也来加锁并且加锁成功,此时又发生中断,OS调度线程A执行,从第二步开始,也加锁成功。
    多核: 见上面例子。
    那么怎么解决呢? 能不能让硬件做一种加锁的原子操作呢? 大名鼎鼎的“test and set”指令就是做这个事情的,该指令将读取内存、判断和设置值作为一个原子操作。单核环境下,锁的操作肯定是原子性了,多核呢?貌似还是不行,因为多个核心他们的锁操作是没有干扰的,都能够同时执行“test and set”,还是会出现两个线程同时获取到锁的情况, 所以硬件提供了锁内存总线的机制,在锁内存总线的状态下执行“test and set”操作就可以保证一个只有一个核执行成功,也就保证了不会存在多线程获取到锁的情况。
    5、 原子操作的实现-硬件
    cpu会通过对总线加锁的手段来解决多核同时获取锁的情况,它到时是怎么实现的呢? 在cpu芯片上有一个HLOCK Pin,可以通过发送指令来操作,将#HLOCK Pin电位拉低,并持续到这条指令执行完毕,从而将总线锁住,这样同一总线上的其他CPU就不能通过总线来访问内存了。最开始这些功能是用来测试cpu的,后来被操作系统实现而封装成各种功能:关键代码段,信号量等。
    在加锁的代码编译成汇编后,会有个lock指令前缀:

Causes the processor’s LOCK# signal to be asserted during execution of the accompanying instruction (turns the instruction into an atomic instruction). In a multiprocessor environment, the LOCK# signal insures that the processor has exclusive use of any shared memory while the signal is asserted.

lock会使得紧跟在其后的指令变成atomic instruction,暂时的锁一下总线,指令执行完,总线就解锁了。


详解并发编程中的CAS原子类 CAS全称,是一种无锁编程算法,即比较当前的值与旧值是否相等若相等则进行修改操作(乐观锁机制),该类常用于多线程共享变量的修改操作。而其底层实现也是基于硬件平台的汇编指令,JVM只是封装其调用仅此而已。而本文会基于以下大纲展开对CAS的探讨。: 原子更新布尔类型。: 原子更新整型。AtomicLong: 原子更新长整型。 阅读详情

相关推荐

【并发编程十三】c++原子操作(1)

std::atomic_flag是最简单的标准原子类型,表示一个布尔标志。该类型的对象只有两种状态:成立或置零。二者必居其一。经过刻意设计,它相当简单,唯一用途是充当构建单元,因此我们认为普通开发者一般不会直接使用它。尽管这样,我们从std:atomic_flag切入,仍能借以说明原子类型的一些通用原则,方便进一步讨论其他原子类型。std:atomic是基于整数类型的最基本的原子类型。相比std:atomic_flag,它是一个功能更加齐全的布尔标志。

junxuezheng的博客 4885

原子操作

1、原子操作 原子操作(atomic operation)指的是由多步操作组成的一个操作。如果该操作不能原子地执行,则要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集。 现代操作系统中,一般都提供了原子操作来实现一些同步操作,所谓原子操作,也就是一个独立而不可分割的操作。在单核环境中,一般的意义下原子操作中线程不会被切换,线程切换要么在原子操作之前,要么在原子操作完成之后。...

justkong的博客 5万+

`volatile` 能保证原子性吗?为什么?

为了提高性能,编译器和处理器常常会对指令序列进行重新排序。编译器优化重排序:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序指令级并行重排序:现代处理器采用指令级并行技术,如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序内存系统重排序:由于CPU使用缓存和读/写缓冲区,加载和存储操作可能出现看起来乱序执行的情况在计算机科学中,原子性可以被形式化地定义为:对于操作序列A,如果在执行过程中没有其他线程能够观察到A的部分执行结果,那么A是原子的。

AI天才研究院 511

C语言的原子操作

原子操作是不可分割的,在执行完毕之前不会被任何其它任务或事件中断,可以视为最小的操作单元,是在执行的过程中、不会导致对数据的并发访问的、最小操作,因此称为原子操作。最简单的原子操作,就是交换一个寄存器和一个内存地址的值,原子操作,是实现锁机制的基础。mutex,spinlock等,在其底层都有一个关键的原子操作。在单线程中, 能够在单条指令中完成的操作都可以认为是" 原子操作",因为中断只能发生于指令之间;在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。

future_sky_word的博客 5311

计算机视觉-深度学习图像检测方法梳理

计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类、目标定位、语义分割、实例分割的区别 a. 图像分类 :给定一张输入图像,图像分类任务旨在判断该图像所属类别; b. 目标定位 :在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以包围盒的(bounding box)形式; c. 语义分割 :语义分割是目标检测更进阶的任务,目标检测只需要框出每个目

qq_41662991的博客 9953

【开源】STM32+ESP8266+MQTT多传感器数据上云OneNET(易拓展,带操作系统FreeRTOS)

【开源】STM32+ESP8266+MQTT多传感器数据上云OneNET(易拓展) 文章目录【开源】STM32+ESP8266+MQTT多传感器数据上云OneNET(易拓展)1. 相关连接1.1 本项目相关连接1.2 无操作系统简易版(旧版,有OneNET云平台设备创建和应用配置,本文不再赘述):2. 具体功能3. 硬件环境4. 云平台环境配置5. 接线6. 功能展示6.1 数据流6.2 APP应用管理6.3 串口数据7. 源码详解7.1 源码文件解析7.2 服务器与wifi配置相关7.3 源码框架7.4

ssssadw的博客 2万+

什么是原子操作

一. 何谓"原子操作": 原子操作就是: 不可中断的一个或者一系列操作, 也就是不会被线程调度机制打断的操作, 运行期间不会有任何的上下文切换(context switch). 二. 为什么关注原子操作? 1. 如果确定某个操作是原子的, 就不用为了去保护这个操作而加上会耗费昂贵性能开销的锁. - (巧妙的利用原子操作和实现无锁编程) 2. 借助原子操作可以实现互斥锁(mutex). (linux中的mutex_lock_t) 3. 借助互斥锁, 可以实现让更多的操作变成原子操作. 三. 单核CPU的原..

zhuiyunzhugang的博客 1万+

BMS菊花链芯片怎么选?一张表对比ADI、TI、NXP五大厂家的隔离通信方案

本文深入对比了ADI、TI、NXP等五大厂商的BMS菊花链芯片隔离通信方案,涵盖技术演进、核心参数和场景化选型策略。通过实测数据和开发经验分享,帮助工程师在新能源汽车和储能系统中选择最优方案,提升通信可靠性和成本效益。

weixin_33724046的博客 432

并发安全和锁(sync) & 原子操作和CAS

当存储完毕后,即可解除不可抢占,返回。使用CAS操作的做法趋于乐观,总是假设被操作值未曾被改变(即与旧值相等),并一旦确认这个假设的真实性就立即进行值替换,那么在被操作值被频繁变更的情况下,CAS操作并不那么容易成功。当互斥锁释放后,等待的goroutine才可以获取锁进入临界区,多个goroutine同时等待一个锁时,唤醒的策略是随机的。互斥锁是完全互斥的,但是有很多实际的场景下是读多写少的,当我们并发的去读取一个资源不涉及资源修改的时候是没有必要加锁的,这种场景下使用读写锁是更好的一种选择。

General_zy的博客 1411

【CQUT】从零开始龙芯杯-开始前的准备

不同级别的Cpu对于vivado综合的时间有较大影响,其中Cpu的单核、多核性能以及cache性能影响权重较高。因此,为了保证学习进度和效率,我们建议在Cpu不低于I5 12400的环境下进行学习。Vivado2023.2安装包约100GB,为了保证成功安装建议留出300GB硬盘空间。龙芯杯的许多资料被托管在gitee,你需要git指令将资料克隆到本地。指定用书:CPU设计实战 Loongarch版 作者:汪文祥、邢金璋。Cpu性能对比网站:https://www.cpu114.com/

weixin_73689971的博客 906

VisionPro开发实战:CogRecordDisplay控件显示与保存图片的完整流程(附C#代码示例)

本文详细解析了VisionPro开发中CogRecordDisplay控件的图像处理全流程,包括图像加载、显示优化、动态清屏及结果保存等关键操作。通过C#代码示例,展示了如何高效使用该控件进行工业视觉应用开发,特别适合自动化检测系统的开发者参考。

weixin_42523792的博客 276

【Java第97集】java Atomic原子类详解

包中的原子类是 Java 并发编程的重要工具,通过CAS 机制提供了无锁的线程安全操作。它们适用于高并发场景中的计数器、状态标志、缓存管理等需求,能够显著提升性能。开发者需根据具体业务场景选择合适的原子类,并注意 ABA 问题等潜在风险。

学不可以已,活到老,学到老。 1031

Ardupilot飞控姿态角与姿态角速度控制过程分析(超长篇)

目录 目录 摘要 1.代码控制过程分析 摘要 本节主要记录自己学习ardupilot飞控代码的姿态角速度的控制过程 1.代码控制过程分析 可以看出:AC_AttitudeControl *attitude_control; //指针对象 virtual void rate_controller_run() = 0;是AC_AttitudeContro...

陌城烟雨 1万+

多线程编程:整个互斥的流程以及scoped_lock的用法,以及作用,以及 硬件上的原子操作和逻辑上的原子操作

现在我们可以把你问的所有东西串成一个完整的流程图std::mutex:定义那把锁。:安全地、成套地去拿锁(防止死锁)。如果厕所里没纸了(条件不满足),你就先出来在走廊椅子上睡一会(wait等保洁阿姨放了纸,她喊一嗓子(notify_all),把你叫醒。你醒了之后,第一件事还是得去抢那把锁(Mutex),抢到了才能再进厕所。如果没有std::scoped_lock 来帮你实现互斥自动上锁解锁如果不用 C++17 推荐的,传统的“普通”写法通常有两种:一种是手动挡(容易出事),另一种是。

一季南凉的博客 428

【Coze】在Coze平台使用源码创建工作流

Coze平台提供低代码工作流搭建功能,支持通过图形化界面快速构建自动化任务流程。用户可通过资源库创建工作流,导入JSON配置生成节点结构,连接起始节点并配置输入/输出字段(需定义数据类型)。平台提供试运行功能验证流程执行,支持可视化调试与发布上线。该方案适用于快速部署标准化业务逻辑,实现端到端的自动化处理。

Mr数据杨 2430

【WRF-Chem】预处理工具(Preprocessors)总结

预处理工具(Preprocessors)总结

WW、forever的博客 1179

linux内核原理-原子变量,自旋锁,互斥锁/信号量

原子变量,自旋锁,互斥锁

x13262608581的博客 1235

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

操作系统中的原语操作:从硬件到软件的原子性保障

本文深入探讨了操作系统中的原语操作,从硬件指令到软件抽象的原子性保障机制。通过分析x86、ARM等架构的原子指令实现,以及Linux内核中的API封装,揭示了高并发系统开发中的关键同步技术。文章还涵盖了互斥锁演进、无锁数据结构设计等高级主题,为开发者提供性能优化和安全实践的指导。

weixin_30839881的博客 583

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

提升--05---并发编程之---原子性---CAS

并发编程之原子性

时光里的博客 745

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

[linux仓库]多线程数据竞争?一文搞定互斥锁与原子操作[线程·伍]

本文深入探讨了Linux线程互斥机制及其底层实现原理。通过抢票Demo案例,分析了共享资源访问导致的数据不一致问题,提出临界资源与临界区的概念,解释了互斥锁如何通过原子性操作解决并发问题。文章详细介绍了互斥锁的初始化、加锁和解锁操作,阐述了RAII设计模式在锁封装中的应用,并对比了C++11原生mutex与pthread库的实现差异。最后,通过汇编层面分析++/--操作的非原子性,揭示了互斥锁的底层实现原理是借助swap/exchange指令保证的原子性操作。

egoist2023的博客 1894

C++原子操作详解:从数据竞争到无锁编程实战

在多线程编程中,数据竞争是常见的并发问题,表现为多个线程同时读写共享变量时出现不可预测的结果。其核心原理在于现代CPU和编译器为了性能优化可能进行指令重排,导致线程间内存访问顺序与代码书写顺序不一致。为解决这一问题,C++11引入了原子操作标准库,提供了内存顺序模型和原子类型,确保对共享变量的操作具有不可分割性。原子操作的技术价值在于以接近硬件原语的效率实现线程安全,避免了传统互斥锁的粗粒度开销。在应用场景上,原子操作广泛用于无锁计数器、线程安全单例模式、自旋锁和无锁数据结构等高性能并发编程领域。本文聚焦于

weixin_33491377的博客 220

Redis的事务操作

Redis的事务操作 redis单条命令是保存原子性的,但是事务不保证原子性 redis的事物本质:一组命令的集合 redis事务没有隔离级别的概念,所有的命令在事务中,并没有直接被执行,只有发起执行命令的时候才会执行。 开启事务(Multi) 命令入队(…) 执行事务(exec) multi //开启事务 discard //取消事务 exec //执行事务 悲观锁 认为什么时候都会出现问题,做什么都会加锁。 乐观锁 认为什么时候都不会出现问题,无论做什么都不会上锁。在更新数据的时候回去判断一下

qq_39379958的博客 130

学习笔记分享-jvm-cas-概述、底层、原子类

学习笔记分享-jvm-cas-概述、底层、原子类

2301_81243975的博客 722

C++原子操作与CAS原理详解:从并发基础到ABA问题实战

并发编程是现代软件开发的核心挑战之一,其核心在于协调多个线程对共享资源的访问,避免数据竞争导致的不确定行为。从原理层面看,硬件通过缓存一致性协议(如MESI)和原子指令为并发操作提供了基础支持,确保了内存操作的可见性与顺序性。在技术实现上,C++11标准引入的<atomic>库将原子操作提升为语言级特性,其中CAS(比较并交换)操作是实现无锁数据结构的关键原语,它能以非阻塞方式实现线程安全,提升程序在高并发场景下的可伸缩性。然而,CAS操作存在经典的ABA问题隐患,即一个值从A变为B再变回A时,CAS无法感

weixin_34199335的博客 566

关于Redis事务的介绍

一、Redis事务的本质 Redis事务的本质是一组命令的集合,相当于一个队列,一个事务中的的所有命令都会被序列化,在事务执行过程中,按照顺序执行,且不会被中断,所以redis的事务有一次性(执行完则当前事务结束,下次事务需要重新开启)、顺序性、排他性。Redis中的事务是比较简单的。 二、事务的操作命令 先说一下事务的操作,这样在介绍Redis特性的时候举例也比较方便 multi #开启事务 set name "zs" #回车,将命令添加到...

qq_41563912的博客 1426
上一篇: 深入理解了一下ioctl
下一篇: 在jetson nano上安装ROS
野-百-合
博客等级 码龄17年 308粉丝 118原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值