一、volatile关键字的使用意义
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,告诉编译器对该变量不做优化,都会直接从变量内存地址中读取数据,从而可以提供对特殊地址的稳定访问。
如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)
二、volatile关键字使用注意事项
1. 中断服务程序中修改的供其它程序检测的变量需要加volatile。 |
2. 多任务环境下各任务间共享的标志应该加volatile。 |
3. 存储器映射的硬件寄存器通常也要加 volatile说明,因为每次对它的读写都可能由不同意义。 |
4. 可以把一个非volatile int赋给volatile int,但是不能把非volatile对象赋给一个volatile对象。 |
5. 除了基本类型外,对用户定义类型也可以用volatile类型进行修饰。 |
6. 有些变量是用 volatile 关键字声明的。当两个线程都要用到某一个变量且该变量的值会被改变时,应该用 volatile 声明,该关键字的作用是防止优化编译器把变量从内存装入 CPU 寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行。volatile 的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值。 |