误用的volatile
Thread 1 | Thread 2 |
---|---|
A = 3 |
reg0 = B |
Registers | States |
---|---|
reg0=5, reg1=3 | possible (thread 1 ran first) |
reg0=0, reg1=0 | possible (thread 2 ran first) |
reg0=0, reg1=3 | possible (concurrent execution) |
reg0=5, reg1=0 | never |
Thread 1 | Thread 2 |
---|---|
A = true |
B = true |
原意为,线程1,2为进入一段代码,需要先看对方状态是不是true。这段代码在顺序一致模型中没有问题,但在SMP架构中,线程1的先写后读可能在线程2看来已经反序了,如下:
Thread 1 | Thread 2 |
---|---|
reg1 = B
|
|
这时,两个线程同时进入了临界代码区。
Thread 1 | Thread 2 |
---|---|
A = 41 |
loop_until (B == 1) |
线程2期望等到线程1中B设置后,再去读A。
内存屏障告诉CPU内存访问需要确保有序。对于单CPU的X86,其实不需要,它天生支持顺序一致。
Thread 1 | Thread 2 |
---|---|
A = 41 |
loop_until (B == 1) |
以上加入了两个内存屏障,写写与读读。
Thread 1 | Thread 2 |
---|---|
reg = A |
loop_until (B == 1) |
如果没有这个屏障,可能线程1在读A时,要从主内存读,同时B有缓存流水线,从主内存读在处理时,B=1已经写了,并且通过一些CPU cache一致性的方法被线程2读到,而这时内存A仍然在读。
do {
success = atomic_cas(&lock, 0, 1) // acquire
} while (!success)
full_memory_barrier() critical-section full_memory_barrier()
atomic_store(&lock, 0) // release
误用的volatile的更多相关文章
- 谈谈volatile关键字以及常见的误解
转载请保留以下声明 作者:赵宗晟 出处:https://www.cnblogs.com/zhao-zongsheng/p/9092520.html 近期看到C++标准中对volatile关键字的定义, ...
- C++11原子操作与无锁编程(转)
不讲语言特性,只从工程角度出发,个人觉得C++标准委员会在C++11中对多线程库的引入是有史以来做得最人道的一件事:今天我将就C++11多线程中的atomic原子操作展开讨论:比较互斥锁,自旋锁(sp ...
- java中volatile关键字
一.前言 JMM提供了volatile变量定义.final.synchronized块来保证可见性. 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值.volatil ...
- java中volatile关键字的含义
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语 ...
- volatile关键字并不能作为线程计数器
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语 ...
- 【转】java中volatile关键字的含义
java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...
- 转:java中volatile关键字的含义
转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...
- volatile之一--volatile不能保证原子性
Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这 ...
- java中volatile关键字的含义 (转载)
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语 ...
随机推荐
- cxf客户端动态调用空指针异常
异常信息如下: 二月 , :: 上午 org.apache.cxf.common.jaxb.JAXBUtils logGeneratedClassNames 信息: Created classes: ...
- 榮耀6 Plus將是一部沒有對手的手機
華為榮耀官方微博發佈消息正式確定了年度旗艦新品將命名為榮耀6 Plus,據稱,該機將是“2014年度最最旗艦手機”,並將集“科學與美學一身”.“探索幾何與視覺極限”,同時,官方微博還不低調地宣稱該機將 ...
- HTML基础篇之HTML基本结构
课堂知识总结 第一接触和学习HTML知识在学习过程中对所属的标签的自己认为的理解和解释. HTML元素:文档里面的标签和内容. 比如:<h1>大家好</h1> 左边的是开始标 ...
- java面试问题整理-垃圾回收
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址.大小以及使用情况.通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象,通过这种方式确定哪些对象是"可达的" ...
- C语言3
C语言的学习已经进入尾声,再过几天就要考试了,今天我们用C语言做了一个推箱子的游戏.就相当于复习以前的知识啦,但是感觉好难啊,但是老师教我们用函数的思想,让我们"分",把问题分解开 ...
- [kuangbin带你飞]专题十 匹配问题 二分匹配部分
刚回到家 开了二分匹配专题 手握xyl模板 奋力写写写 终于写完了一群模板题 A hdu1045 对这个图进行 行列的重写 给每个位置赋予新的行列 使不能相互打到的位置 拥有不同的行与列 然后左行右列 ...
- Chrome F12学习
Chrome实用调试技巧 Chrome调试工具常用功能整理 Google Chrome开发者工具使用(图文教程) 如何更专业的使用Chrome开发者工具
- undefined reference to `libiconv_open 无法编译PHP
解决方法:#wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz#tar -zxvf libiconv-1.13.1.tar. ...
- Zookeeper学习笔记
ZK ID存放路径 /tmp/zookeeper/myid
- 响应式布局 Bootstrap
github介绍 (1)简单灵活可用于架构流行的 用户界面和交互接口 的html.css.javascript工具集 (2)基于html5.css3的bootstrap,具有大量的诱人特征: 友好的学 ...