现在的位置: 首页 > 综合 > 正文

关于c中volatile关键字

2013年04月22日 ⁄ 综合 ⁄ 共 486字 ⁄ 字号 评论关闭
这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}

volatile 关键字告诉编译器不要持有变量的临时性拷贝。一般用在多线程程序中,以避免在其中一个线程操作该变量时,将其拷贝入寄存器。请看以下情形:

a线程将变量复制入寄存器,然后进入循环,反复检测寄存器的值是否满足一定条件(它期待b线程改变变量的值。
在此种情况下,当b线程改变了变量的值时,已改变的值对其在寄存器的值没有影响。所以a线程进入死循环。

volatile 就是在此种情况下使用。

本文转自
http://www.runup.com.cn/it/p54/J546604_2.shtml

抱歉!评论已关闭.