volatile的意思是:易变。在程序中,如果一个变量使用volatile修饰,表示这个变量是易变的,每次都需要从内存中重新读取该变量的值。
为什么需要使用该变量呢?
-
可能由于程序之外的原因,导致变量的值发生改变,需要重新读取更新。
-
可以限制编译器的优化。例如:编译器优化将一个值保存在寄存器中,变量的值发生改变而没有被读取更新。
什么场景使用volatile修饰变量:
-
全局共享变量需要使用该修饰符
-
并行读写变量需要使用该修饰副(多线程共享变量,并行设备的硬件寄存器等)
需要注意:
-
const和volatile可以同时使用。两个修饰符同时使用并不冲突,const表示程序不显式修改变量,而volatile表示变量可能由于其他外部原因被修改。 -
volatile可修饰指针。指针也是普通变量,也可能被外部修改。
最后简单看一个例子:
volatile bool g_flag = false;
void thread_1(void) {
while (g_flag) dosomething();
}
void thread_2(void) {
g_flag = true;
}
如果变量g_flag不使用volatile修饰,可能寄存器中的g_flag永远为false,dosomething函数永远不被执行。