关键字volatile

     C中的关键字volatile的中文意思是“可变的, 不稳定的”。

    这一段引用于http://dev.youkuaiyun.com/Develop/article/28/80116.shtm

一般说来,volatile用在如下的几个地方: 
1、中断服务程序中修改的供其它程序检测的变量需要加volatile; 
2、多任务环境下各任务间共享的标志应该加volatile; 
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;  

声明方式为  volatile declaration

备注
系统总是在 volatile 对象被请求的那一刻读取其当前值,即使上一条指令从同一对象请求值。而且,该对象的值在赋值时立即写入。
volatile 修饰符通常用于由多个线程访问而不使用 lock 语句来序列化访问的字段。使用 volatile 修饰符能够确保一个线程检索由另一线程写入的最新值。

    这一段引用于《C++变成思想:第一卷》第3章 3.6.6

    限定词volatile告诉编译器“不知道何时会改变”,防止编译器依据变量的稳定性作任何优化。当读在代码控制之外的某个值时,例如读一块通信硬件中的寄存器,将使用这个关键字。无论何时需要volatile变量的值,都能读到,即使在该行之前刚刚读过。

    综上,为什么会在linux内核中用到volatile关键字,我想主要是因为内核有许多直接操作寄存器的汇编代码,而这些汇编代码就是“在代码控制之外”的代码。编译器检测不到这些汇编代码对变量值的改变,那么在编译器做优化的时候就会读出一些“脏值”或者“旧值”,而这又是我们不愿意看到的。

    在2.4.0内核中 atomic_t 的定义:

/*
 * Make sure gcc doesn't try to be clever and move things around
 * on us. We need to use _exactly_ the address the user gave us,
 * not some alias that contains the same information.
 
*/

typedef 
struct   volatile int counter; }  atomic_t;

    下面是一个转载很多的例子,我编译没有通过

    没有使用volatile的代码:

#include  < iostream >
void  main()
{
int i=10;
int a = i;

printf(
"i= %d ",a);

__asm 
{
mov dword ptr [ebp
-4], 50h
}

//下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道,来隐式的修改了变量。
int b = i;
printf(
"i= %d ",b);
}

    使用了volatile的代码:

#include  < iostream >
void  main()
{
 
volatile int i=10;
 
int a = i;

 printf(
"i= %d ",a);
 __asm 
{
  mov         dword ptr [ebp
-4], 50h
 }


 
int b = i;
 printf(
"i= %d ",b);
}

    现在对volatile有概念上的了解,但还没有在实践中使用到。有时间先编译通过上面的嵌入汇编代码再说深层的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值