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

处理器如何实现原子操作

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

如果多个处理器同时对共享变量进行读写操作,那么共享变量就会被多个处理器同时进行操作,这样读写操作就不是原子的,操作完之后共享变量的值会和期望的不一致.

所谓总线锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出次信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存.

在x86 平台上,CPU提供了在指令执行期间对总线加锁的手段。CPU芯片上有一条引线#HLOCK pin,如果汇编语言的程序中在一条指令前面加上前缀"LOCK",经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的。

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

通过缓存锁定保证原子性。在同一时刻我们只需保证对某个内存地址的操作是原子性即可,但总线锁定把CPU和内存之间通信锁住了,这使得锁定期间,其他处理器不能操作其他内存地址的数据,所以总线锁定的开销比较大。

所谓“缓存锁定”就是如果缓存在处理器缓存行中内存区域在LOCK操作期间被锁定,当它执行锁操作回写内存时,处理器不在总线上声言LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时会起缓存行无效。

但是有两种情况下处理器不会使用缓存锁定。第一种情况是:当操作的数据不能被缓存在处理器内部,或操作的数据跨多个缓存行(cache line),则处理器会调用总线锁定。第二种情况是:有些处理器不支持缓存锁定。对于Inter486和奔腾处理器,就算锁定的内存区域在处理器的缓存行中也会调用总线锁定。

转载:https://www.cnblogs.com/zhanghu52030/p/9167014.html

c++并发编程之原子操作的实现原理相关推荐

  1. Java Review - 并发编程_原子操作类LongAdder LongAccumulator剖析

    文章目录 概述 小Demo 源码分析 重要的方法 long sum() reset sumThenReset longValue() add(long x) longAccumulate(long x ...

  2. 并发编程系列之AQS实现原理

    并发编程系列之AQS实现原理 1.什么是AQS? AQS(AbstractQueuedSynchronizer),抽象队列同步器,是juc中很多Lock锁和同步组件的基础,比如CountDownLat ...

  3. Java 并发编程:Synchronized 及其实现原理

    作者:liuxiaopeng 原文链接: www.cnblogs.com/paddix/p/5367116.html 一.Synchronized的基本使用 Synchronized是Java中解决并 ...

  4. 并发编程(一)多线程基础和原理

    多线程基础 最近,准备回顾下多线程相关的知识体系,顺便在这里做个记录. 并发的发展历史 最早的计算机只能解决简单的数学运算问题,比如正弦. 余弦等.运行方式:程序员首先把程序写到纸上,然后穿 孔成卡片 ...

  5. java并发编程-volatile内存实现和原理

    2019独角兽企业重金招聘Python工程师标准>>> 前面的博文说了java的内存模型,介绍了java内存模型的基础,此篇文章来说一下volatile关键字,这个在并发编程中,占有 ...

  6. Java Review - 并发编程_原子操作类原理剖析

    文章目录 概述 原子变量操作类 主要方法 incrementAndGet .decrementAndGet .getAndIncrement.getAndDecrement boolean compa ...

  7. 【并发编程】Atomic的实现原理

    atomic原子类实现机制_atomic实现原理 [linux内核分析与应用-陈莉君]内核同步概述 1.直接操作内存,使用Unsafe这个类 2.使用 getIntVolatile(var1, var ...

  8. java并发编程——线程池的工作原理与源码解读

    2019独角兽企业重金招聘Python工程师标准>>> 线程池的简单介绍 基于多核CPU的发展,使得多线程开发日趋流行.然而线程的创建和销毁,都涉及到系统调用,比较消耗系统资源,所以 ...

  9. Java并发编程-线程池底层工作原理

    线程池底层工作原理 1.线程池的底层工作流程 1.1.线程池的底层工作原理图 1.2.银行办理业务案例 1.3.线程池的底层工作流程总结 2.线程池用哪个?生产中如何设置合理参数 2.1.在工作中单一 ...

最新文章

  1. 优雅地处理重复请求(并发请求)
  2. pandas 读写 excel 数据
  3. Java并发编程实战笔记2:对象的组合
  4. yii required 字段去除*号
  5. 深度学习训练,选择P100就对了
  6. 通信原理-随相数字信号的最佳接收
  7. flask 开发接口测试平台
  8. leetcode-19-删除链表的倒数第N个节点
  9. Matplotlib - 折线图 plot() 所有用法详解
  10. 库克:iPhone决不妥协!不爽换安卓 iPhone 更有“安全性和隐私性”
  11. java测试步骤_java测试框架的方法
  12. 2020大数据技术体系结构图,你值得拥有
  13. 结构专业规范大全_监理签字用语规范大全,就是这么专业!
  14. 高通CSRA6640单芯片DDFA放大器解决方案
  15. discuzq 去除页面版权
  16. 香农定理与奈奎斯特定理
  17. T t与T t = T()的区别
  18. 谁你的财神 谁是你的穷神
  19. 吉林省松原市谷歌高清卫星地图下载
  20. 2019京东618活动提报要求一览

热门文章

  1. mysql选择数据库创建数据库
  2. 经常使用的 WEB server
  3. which 命令
  4. iOS开发-XMPP
  5. 开源框架:CocoaPods 安装学习教程
  6. 宋体配置JAVA j2ee (一) 轻松入门
  7. Adobe CTO:Android将超预期获50%份额
  8. ASP.NET AJAX入门系列(10):Timer控件简单使用
  9. Diango博客--17.统计各个分类和标签下的文章数
  10. win7如何添加终端服务器,Windows7系统超级终端的添加方法 win7如何添加超级终端...