C++笔记 - volatile

365 阅读1分钟

volatile的意思是:易变。在程序中,如果一个变量使用volatile修饰,表示这个变量是易变的,每次都需要从内存中重新读取该变量的值。


为什么需要使用该变量呢?

  • 可能由于程序之外的原因,导致变量的值发生改变,需要重新读取更新。

  • 可以限制编译器的优化。例如:编译器优化将一个值保存在寄存器中,变量的值发生改变而没有被读取更新。


什么场景使用volatile修饰变量:

  • 全局共享变量需要使用该修饰符

  • 并行读写变量需要使用该修饰副(多线程共享变量,并行设备的硬件寄存器等)

需要注意:

  • constvolatile可以同时使用。两个修饰符同时使用并不冲突,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永远为falsedosomething函数永远不被执行。