一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1) 并行设备的硬件寄存器(如:状态寄存器)
2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3) 多线程应用中被几个任务共享的变量
volatile 表示这个变量可能被意外改变,
比如被中断或者操作系统在你的程序不知道的时候修改。
它要求编译器不要对有关这个变量的代码进行优化。
比如
long flag=1;
int main()
{
long sum=0;
for(int i=0;i<10000;i++)
sum+=flag;
printf("sum=%d",sum);
return 0;
}
假设在循环到 5000次的时候,falg变成了2.
上面的程序结果将仍然是 10000,而不是15000
因为编译器会把flag优化成一个寄存器(可能是AX),
而不会真正去读取flag的值。
如果
volatile long flag=1;
就能得到正确结果.