volatile 注意事项

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 永远为 false, dosomething 函数永远不被执行. 如果觉得有帮助,可以扫描右边的微信打赏码支持一下.

Leave a Reply

Your email address will not be published. Required fields are marked *