关键字volatile

    技术2022-05-11  111

         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=10int a = i; printf("i= %d ",a); __asm {  mov         dword ptr [ebp-4], 50h } int b = i; printf("i= %d ",b);}

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


    最新回复(0)