volatile关键字

volatile“易变的”

下面说一种情况:

short flag;
void test()
{
do1();
while(flag==0);
do2();
}

  这段程序等待flag变为1后去执行do2函数。如果编译器优化过后,可能会把flag读入寄存器,然后每次从寄存器中读flag值。及时其他程序更改了flag,但这里也会不得而知,变成了死循环。

解决办法就是在flag上声明为 volatile。需要注意的是,没有volatile也可能能正常运行,但是可能修改了编译器的优化级别之后就又不能正常运行了。因此经常会出现debug版本正常,但是

release版本却不能正常的问题。所以为了安全起见,只要是等待别的程序修改某个变量的话,就加上volatile关键字。

  一般说来,volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

原文地址:https://www.cnblogs.com/luntai/p/6140774.html