QAtomicInt支持四种类型的操作,Relaxed、Acquired、Release、Ordered
Memory Ordering
- Background
很久很久很久以前,CPU忠厚老实,一条一条指令的执行我们给它的程序,规规矩矩的进行计算和内存的存取。
很久很久以前, CPU学会了Out-Of-Order,CPU有了Cache,但一切都工作的很好,就像很久很久很久以前一样,而且工作效率得到了很大的提高。
很久以前,我们需要多个CPU一起工作,于是出现了传说中的SMP系统,每个CPU都有独立的Cache,都会乱序执行,会打乱内存存取顺序,于是事情变得复杂了…… - Problem
由于每个CPU都有自己的Cache,内存读写不再一定需要真的作内存访问,而是直接从Cache里面操作,同时CPU可能会在合适的时候对于内存访问进行重新排序以提高效率,在只有一个CPU的时候,这很完美。
而当有多个CPU的时候——- 从Cache到内存的flush操作通常是被延迟的,所以就需要某种方法保证CPU A进行的内存写操作真的可以被CPU B读取到。
- CPU可能会因为某些原因(比如某两个变量同在一个Cacheline中)而打乱
- 实际内存写入顺序
- 实际内存读取顺序
所以就需要某种方法保证在需要的时候
- 之前的读写操作已经完成
- 未来的读写操作还没开始
考虑一个例子:
Thread A:
while (flag == 0)
; // do nothing
printf("%d\n", data);Thread B:
这里data代表了某种数据,它可以像这里一样是一个简单的整数,也可能是某种复杂的数据结构,总之,我们在Thread B中对data进行了写入,并利用flag变量表示data已经准备好了。
data = 523;
flag = 1;
在Thread A中,一个忙等待直到发现data已经准备好了,然后开始使用data,这里是简单的把data打印出来。
现在考虑如果CPU发现对于data和flag的写入,如果按照先写入flag后写入data的方式进行,或者考虑由于Cache的flush操作的延迟,使得内存中变量的实际修改顺序是先flag后data,那么都将导致Thread A的结果不正确。事实上,由于内存读入操作同样是可能乱序进行的,Thread A甚至可能在读入flag进行判断之前就已经完成了对data的读入操作,这同样导致错误的结果。 - Solution
在这个例子中,我们的需求是,Thread A中对于flag判断时,后面的任何读入操作都没有开始,Thread B中对于flag写入时,任何之前的写入操作都已经完成。
在Linux内核中,smp_rmb()、smp_wmb()、smp_mb()就是用来解决这类问题的,mb表示memory barrier。rmb表示读操作不可跨越(注意,不是人民币的意思:-P),也就是我们这个例子中的Thread A所需要的。wmb表示写操作不可跨越,也就是这里Thread B所需要的。mb集合了rmb和wmb的能力,读写操作都不可跨越。
在Qt中,其支持原子操作的类QAtomicInt支持四种类型的操作,Relaxed、Acquired、Release、Ordered,其中 Relaxed最为简单,就是不做特殊要求,由编译器和处理器对读写进行合适的排序。Acquired表示原子操作之后的内存操作不可被重排至原子操作之前。Release表示原子操作之前的内存操作不可被重排至原子操作之后。Ordered表示Acquired + Release。在前面的例子中,Thread A对于flag的读取操作需要Acquired版本,而Thread B对于flag的写入操作需要Release版本。
在实际实现中,不同体系结构的实现方法各不相同,很多RISC机器提供了专门的指令用于实现mb,而在x86上面,通常使用lock指令前缀加上一个空操作来实现,注意当然不能真的是nop指令,但是可以用来实现空操作的指令其实是很多的,比如Linux中采用的addl $0, 0(%esp)。Qt的不同类型原子操作由于本身就需要进行某种可被lock前缀修饰的操作,所以就不需要画蛇添足的再写一条空操作了,比如 testAndSetOrdered就可以直接使用lock cmpxchgl实现。
转贴自:http://etrnlog.appspot.com/2009/10/12/memory-ordering.html
http://www.cnblogs.com/codingmylife/archive/2010/04/28/1722573.html
QAtomicInt支持四种类型的操作,Relaxed、Acquired、Release、Ordered的更多相关文章
- 领域模型中的实体类分为四种类型:VO、DTO、DO、PO
http://kb.cnblogs.com/page/522348/ 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: V ...
- JDBC驱动的四种类型
Java中的JDBC驱动可以分为四种类型,包括JDBC-ODBC桥.本地API驱动.网络协议驱动和本地协议驱动. JDBC驱动类型一.JDBC-ODBC桥 JDBC-ODBC 桥 是sun公司提供的, ...
- 域模型中的实体类分为四种类型:VO、DTO、DO、PO
经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析. 得出的主要结论是:在项目应用中,VO对应于页面上需要显示的数据(表单),DO对应 ...
- 转:领域模型中的实体类分为四种类型:VO、DTO、DO、PO
经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析.得出的主要结论是:在项目应用中,VO对应于页面上需要显示的数据(表单),DO对应于 ...
- ORCAL 数据库的约束以及SQL语言的四种类型
oracle数据库约束: 定义:要输入的这个值是一个什么样的值, 或者是哪个范围内的值 作用: 确保完整性, 确保精确性 1, 非空约束(not null) 记录一条信息的时候如果用户名和密码没有被记 ...
- javascript四种类型识别的方法
× 目录 [1]typeof [2]instanceof [3]constructor[4]toString 前面的话 javascript有复杂的类型系统,类型识别则是基本的功能.javascrip ...
- C#中方法的参数的四种类型
C#中方法的参数有四种类型: 1. 值参数类型 (不加任何修饰符,是默认的类型) 2. 引用型参数 (以ref 修饰符声明) 3. 输出型参数 (以out 修 ...
- php表单提交 图片、音乐、视频、文字,四种类型共同提交到数据库
这个问题一直困扰了我好几天,终于在今天让我给解决了,难以掩饰的激动. 其实在之前没有接触到这种问题,只是表单提交数据而已,再就是图片,四种类型同时提交还真是没遇到过,做了一个系统,其中有一个功能就是提 ...
- MySQL四种类型日志:Error Log、General Query Log、Binary Log、Slow Query Log
MySQL Server 有四种类型的日志——Error Log.General Query Log.Binary Log 和 Slow Query Log. 第一个是错误日志,记录mysqld的一些 ...
随机推荐
- php数组插入数据
php数组插入数据 一.总结 代码要多敲,看是看不会的 php代码直接在页面不好敲,可以去控制器里面敲 二.目标 在一组数中,要求插入一个数,按其原来顺序插入,维护原来排序方式. 三.代码 (1).思 ...
- [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.0:compile (default-compile) 问题解决
问题描述详情: 无论你的问题是3.0还是3.1还是任何一个版本,则都可以通过以下版本来解决 解决办法: 把默认的Internal JRE改成了JAVA_HOME. 运行后成功了,截图如下:
- 1.3 Quick Start中 Step 3: Create a topic官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Step 3: Create a topic Step 3: 创建一个主题(topi ...
- HTML5的设计目的是为了在移动设备上支持多媒体
HTML5的设计目的是为了在移动设备上支持多媒体
- Docker+Mongodb
原文:Docker+Mongodb docker search mongodb docker run -d -p 2701:27017 -v /usr/mongodb/data:/data/db - ...
- C#之使用app.config可记录数据,下次打开可读取记录的数据
一.背景 如下图所示,我通过open..按键打开了某个文件,之后我再把app给关闭掉,当再次打开app的时候,在textBox.Text上显示上一次打开的文件路径.通过使用app.config可以保存 ...
- 【Todo】Zookeeper系列文章
http://nileader.blog.51cto.com/1381108/1068033
- [NPM] Test npm packages locally in another project using npm link
We will import our newly published package into a new project locally to make sure everything is wor ...
- 几个经常使用的cmd命令
compmgmt.msc 计算机管理 devmgmt.msc 设备管理器 diskmgmt.msc 磁盘管理工具 dfrg.msc 磁盘碎片整理 eventvwr.msc 事件查看器 fsm ...
- 【程序猿笔试面试复习】之中的一个 网络与通信篇(一) 几大网络模型:OSI、TCP/IP、B/S与C/S、MVC结构
9.1网络模型 9.1.1. OSI七层模型 OSI(Open System Interconnection,开放系统互联)七层网络模型称为开放式网络互联參考模型.其为国际标准组织指定的一个指导信息互 ...