zoukankan      html  css  js  c++  java
  • 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函数。

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

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

  • 相关阅读:
    re正则表达式公式讲解3
    re正则表达式2
    re正则表达式公式讲解1
    洛谷 P2962 [USACO09NOV]灯Lights
    9.26模拟赛
    BZOJ 1567: [JSOI2008]Blue Mary的战役地图

    洛谷 P2919 [USACO08NOV]守护农场Guarding the Farm
    洛谷P3252 [JLOI2012]树
    P3183 [HAOI2016]食物链
  • 原文地址:https://www.cnblogs.com/zhuxiaoxiao/p/3608930.html
Copyright © 2011-2022 走看看