对李先静文章中volatile变量的量化小分析

标签: 科技普及 | 发表时间:2011-10-21 21:02 | 作者:陈怀临 Alex
出处:http://www.tektalk.org
下面是一段简单的代码,试图对李先静文章中的volatile进行一些量化分析。变量foo是一个static变量。下面分析了non volatile和volatile的不同的汇编语言结果。
static int foo;
void bar(void) {
foo = 0;
while (foo != 255)
;
}
.text
.align 4,0×90
.globl _bar
_bar:
LFB2:
pushq   %rbp
LCFI0:
movq    %rsp, %rbp
LCFI1:
movl    $0, _foo(%rip)//变量初始化为0
L2:
jmp     L2//死循环,因为编译优化,认为foo变量永远是0;
如果对变量做volatile处理,禁止编译优化。
static volatile int foo;
void bar(void) {
foo = 0;
while (foo != 255)
;
}

.text
.align 4,0×90
.globl _bar
_bar:
LFB2:
pushq   %rbp
LCFI0:
movq    %rsp, %rbp
LCFI1:
movl    $0, _foo(%rip) //foo变量赋初值为0
.align 4,0×90
L2:
movl    _foo(%rip), %eax
//必须force做memory的load操作。从而在多CPU下,或者系统
//中有其他逻辑,例如DMA,FPGA操作的情况下,CPU能感知
cmpl    $255, %eax
jne     L2 //如果变量有变化,函数返回
leave//离开while控制逻辑
ret

相关 [文章 volatile 变量] 推荐:

对李先静文章中volatile变量的量化小分析

- Alex - 弯曲评论
下面是一段简单的代码,试图对李先静文章中的volatile进行一些量化分析. 变量foo是一个static变量. 下面分析了non volatile和volatile的不同的汇编语言结果. movl    $0, _foo(%rip)//变量初始化为0. jmp     L2//死循环,因为编译优化,认为foo变量永远是0;.

[原]Java多线程中的synchronized、volatile和无锁编程

- - Snowball
新建状态(New):新创建了一个线程对象. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法. 该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行.

文章: HTML5之美

- - InfoQ cn
如今大热的HTML5到底美在哪里. HTML5到底能为实际的移动开发带来哪些改变. 来自阿里云云手机服务运营部的前端开发工程师 正邪 (廖健)分享了他眼中的HTML5之美,主要讲诉HTML5的常见原理并从CSS、JavaScript和框架三个方面做了细致讲解:. 白伟民:酷狗音乐的HTML5实践(百度开发者大会广州站 5月31日 免费报名).

技术文章的质量

- Kai Chen - 4G spaces
推友 @StarrySource 就微薄和推特的好坏问题写了一篇文章,正好和霍炬的文章同时发出来,推特上对这两篇文章叫好的人不少,其中还有一些直接就说 StarrySource 这篇比 virushuo 写得好. 文章好坏诚然是个很主观的事情,不过就仅从文章内容来说,就算有一千个读者一千个主观标准,我也想不出什么理由来说明 StarrySource 的这篇比 virushuo 写得好,因为客观上这两篇文章的差距会抵充掉主观上的一些好恶.

英文文章編輯checklist

- friedvan - 研究生2.0
相信我,如果你想要在學術圈混下去,想要將文章投稿到國際期刊,不管是什麼領域,英文寫作都是非常重要的. 有句話是這麼說的:好的writing讓你上天堂,不好的writing帶你住套房. 不喜歡這句的話,可以換成:好的writing給你publication,不好的writing給你rejection.

文章: Grails最佳实践

- - InfoQ cn
我在IntelliGrape工作,这是一家专门使用Groovy & Grails进行开发的公司. 本文是我们Grails项目遵循的最佳实践的基本清单,收集自邮件列表、Stack Overflow、博文, 播客和 IntelliGrape的内部讨论. 它们分为控制器、服务、Domain、视图、TagLib、测试和其他.

文章: 集成Lucene和HBase

- - InfoQ cn
在所有先进的应用程序中,不管是购物站点还是社交网络乃至风景名胜站点,搜索都扮演着关键的角色. Lucene搜索程序库事实上已经成为实现搜索引擎的标准. 苹果、IBM、Attlassian(Jira)、Wolfram以及很多大家喜欢的公司【1】都使用了这种技术. 因此,大家对任何能够提升Lucene的可伸缩性和性能的实现都很感兴趣.

文章: MVVM启示录

- - InfoQ cn
熟悉WPF或Silverlight的同学应该不会对MVVM模式感到陌生了,它把应用程序划分成视图、视图模型和模型三层,如图1所示:. 百度技术沙龙第二十五期:海量数据处理技术解析(4月7日 周六). 表面上,这个层次结构还蛮清楚的,但如果你细究每层应该包含什么,事情就没那么简单了. 视图应该是最容易理解的一个部分了,它通常是指用户可以看到的界面,一般都是通过XAML代码来实现的.

文章: XA事务处理

- - InfoQ cn
本文选自迷你书 《Java事务设计策略》的第五章,译者翟静. 百度技术沙龙第二十五期:海量数据处理技术解析(4月7日 周六). 为了说明X/Open XA接口在JTA事务管理中的重要性,以及它使用的时机,我们以前一章提到的一段固定收入交易的EJB代码为例:. 这段代码中,首先预置了一笔交易,而后执行交易,这两个操作更改了数据库中不同的表.

文章: MongoDB、Java及ORM

- - InfoQ cn
目前有很多互相竞争的NoSQL产品,它们使用的方式不尽相同,但都能很好地解决大数据问题. MongoDB就是其中一款非常不错的产品. MongoDB是面向文档、无Schema的存储解决方案,它用JSON风格的文档展现、查询、修改数据. MongoDB有很丰富的文档,安装和设置都很简单,而且易于扩展.