posts - 297,  comments - 15,  trackbacks - 0
1.volatile有什么用呢?
volatile,只一个变量可能随时由于外界地变化而变化
例如有两个线程分别是线程1和线程2
一个全局变量volatile int i = 0;

线程1
执行如下代码
while(i == 0);
printf();
假设线程1执行到 while处,就会反复执行上这条语句

此时线程2执行
i = 1;

线程1就会执行 printf()

若没有指定 int i 为 volatile
则当线程2执行 i = 1;
时,线程1仍然继续执行while语句

也就是说线程1没有感知变量i的变化

这是由于编译器会对代码进行优化,以及将i
变量装入寄存器的原因,当i再内存中的值发生变化时
无法判断在那个寄存器中有该变量的拷贝,而且不能
同步更新该拷贝

因此需要说明该变量为volatile
这样,编译器不会将该变量装入寄存器,而且不会对
涉及该变量的操作进行优化.

下面有个更理论性的解释:
volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常 量传播等优化,进一步可以死代码消除。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化,volatile的字面含义是 易变的,它有下面的作用:

1 不会在两个操作之间把volatile变量缓存在寄存器中。在多任务、中断、甚至setjmp环境下,变量可能被其他的程序改变,编译器 自己无法知道,volatile就是告诉编译器这种情况。

2 不做常量合并、常量传播等优化,所以像下面的代码:
volatile int i = 1;
if (i > 0) ...

if的条件不会当作无条件真。

3 对volatile变量的读写不会被优化掉。如果你对一个变量赋值但后面没用到,编译器常常可以省略那个赋值操作,然而对Memory Mapped IO的处理是不能这样优化的。

前面有人说volatile可以保证对内存操作的原子性,这种说法不大准确,其一,x86需要LOCK前缀才能在SMP下保证原子性,其二,RISC根本不能对内存直接运算,要保证原子性得用别的方法,如atomic_inc。

对于jiffies,它已经声明为volatile变量,我认为直接用jiffies++就可以了,没必要用那种复杂的形式,因为那样也不能保证原子性。

你可能不知道在Pentium及后续CPU中,下面两组指令

inc jiffies
;;
mov jiffies, %eax
inc %eax
mov %eax, jiffies

作用相同,但一条指令反而不如三条指令快。
posted on 2010-02-03 09:16 chatler 阅读(189) 评论(0)  编辑 收藏 引用 所属分类: C++_BASIS

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用链接

留言簿(10)

随笔分类(307)

随笔档案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感觉这个博客还是不错,虽然做的东西和我不大相关,觉得看看还是有好处的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新评论

阅读排行榜

评论排行榜