C中的关键字volatile的中文意思是“可变的, 不稳定的”。
这一段引用于http://dev.csdn.net/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有概念上的了解,但还没有在实践中使用到。有时间先编译通过上面的嵌入汇编代码再说深层的了。
