• volatile关键字


    volatile:它是被设计用来修饰被不同线程访问和修改的变量

    一般用在以下3个地方:

    1、多进程多任务共享的标志需要加上它

    2、中断服务中被修改并且被其它程序检测的变量需要加上它

    3、并行设备的硬件寄存器(如:状态寄存器)

    msdn中volatile的定义是

    A type qualifier that you can use to declare that an object can be modified in the program by the hardware“

    例如:

    static int i;
    int main(){
        while(true)
    { if(i) dosomething(); } }
    void pau(void)
    {
    i=1;
    }

     程序本意是当pau中断产生时在main中调用dosomthing函数,但是,由于编译器判断在main函数里面没有修改过i, 所以有可能只执行一次把i存某寄存器的操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething再也不会被调用。加上volatile后,程序就会告诉编译器不要对i进行优化操作,每次读取都要执行dosomething函数。

    所谓的编译器优化:在一个线程内,当读取一个变量时,为提高存取速度,编译器有时会先把变量读取到一个寄存器中;以后再取变量值时,就直接从寄存器中取值,从而提高数据的读取速度;

    可是这样问题就来了,如果是同一个线程内数据的变化,寄存器中的变量值会随着变量值的改变而改变,如果是另外一个线程导致它的值发生变化,寄存器中的值并不会改变,从而使得从寄存器中读取的值并不是变量实际的值。

  • 相关阅读:
    poj1087最大流拆点
    3月15上午的函数练习
    3月15
    3月13上午
    3月13
    3月12
    break语句
    3月11
    3月10号
    3月9号
  • 原文地址:https://www.cnblogs.com/zhuxiaoxiao/p/3608930.html
Copyright © 2020-2023  润新知