原子(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. Dell服务器常用管理命令总结
  3. 2.12 总结-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  4. python的读取纯文本文件的几种模式
  5. MapxTreme2008的打包过程
  6. python3怎么安装gmpy2_python2/3 模块gmpy2在linux下安装
  7. Java中super与this
  8. Android 自动动画布局更新 使用,在RecyclerView上使用布局动画(Layout animation)
  9. 硬盘数据恢复入门教程
  10. php导入导出xls表,TP5.0 PHPExcel 数据表格导出导入
  11. 蓝桥杯2019年第十届C/C++省赛A组第二题-数列求值
  12. iOS底层探索之类的结构(中):bits
  13. 判断一个对象是否存在
  14. 我有几个粽子,和一个故事
  15. pidgin qq_如何在Pidgin中将Google Apps帐户用于GTalk
  16. lodop直接打印服务器的文件,C-Lodop云打印服务器
  17. java+javascript获得两个日期之间的所有月份
  18. 使用遇到的问题_使用网络线上教学系统遇到问题怎么办?
  19. Python中如何将浮点型数据转换成整型
  20. TQ2440 学习笔记—— 3、如何在ubuntu 9.10 下安装vmware-tools?

热门文章

  1. Python功能之反射
  2. 让数据中心变得更加友好
  3. Centos 下面升级系统内核(转)
  4. android 安装应用程序apk安装不了
  5. struts2.1.6教程二、struts.xml配置及例程
  6. 单独一台机器测试Open×××加密隧道的问题和解决
  7. 利用ACS来实现AAA服务
  8. VS2005(c#)项目调试问题解决方案集锦
  9. 网络爬虫--18.python中的GIL(全局解释器锁)、多线程、多进程、并发、并行
  10. ancestral 箭头符号,译林版《牛津高中英语》模块五 高二上学期