volatile在程序设计中的应用

记得在学习c语言时,大部分关键字都是知道的,有那么一两个关键字好像没怎么见过,其中这里的volatile就是一个,那么它到底有什么用呢?


不得不说这个关键字真的很少用,估计不少同学大学毕业了都没用过,不过再某些特定场合确有奇效。
好了,闲话休庭,言归正传!


想象一下你编写了一个多线程应用,变量的值可能因为别的线程而改变了,而寄存器的值不会相应的改变,从而造成程序读取的值和实际值不一致。例如,在本次线程内,当读取一个变量时,为了提高存取速度,编译器优化时有时会把变量读取到一个寄存器中;当以后再取变量时,就直接从寄存器中读取;当变量值在本线程里改变时,会把变量的新值复制到该寄存器中,以便保存一致。


volatile是一个类型修饰符,它用来修饰被不同线程访问和修改的变量。被volatile类型定义的变量,系统每次用刀它的时候都是直接从对于的内存当中提取,而不被利用cache中的原有数值,以适应它的未知何时回发生变化,系统对这种变量的处理不会做优化。所以,volatile一般用于修饰多线程间被多个任务共享的变量和并行设备硬件寄存器
我们可以通过在代码中加入汇编代码,测试有无volatile关键字对程序结果的影响。


首先建立一个voltest.cpp文件,代码如下:

#include<stdio.h>
int main()
{
    int i=10;
    int a=i;
    printf("i=%d\n",a);
    //下面这段汇编语句的作用是改变内存中i的值,但是又不让编译器知道
    _asm
    {
        mov dword ptr [ebp-4],20h
    }
    int b=i;
    printf("i=%d\n",b);
    return 0;
}

在debug调试版本运行程序,输出结果如下:
i=10
i=32
在release版本模式运行如下
i=10
i=10


输出结果表明,在release模式,编译器对代码进行了优化,第二次没有输出正确的i值。把i的声明加上volatile关键字:

volatile int i=10;

在debug和release版本运行下结果均为:
i=10
i=32


一个定义为volatile的变量是说这个变量可能会被意想不到地改变,这样编译器就不会假设这个变量的值了。准确的说,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

参考书籍:《程序员面试宝典》

猜你喜欢

转载自blog.csdn.net/q__y__L/article/details/53843581