C/C++关键字:volatile 的应用场景
volatile 的简介
当对象的值可能在程序的控制或检测之外被改变时,应该将该对象声明为 volatile,告知编译器不应对这样的对象进行优化。volatile 关键字修饰变量后,提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有 volatile 关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
使用 volatile 关键字试图阻止编译器过度优化,volatile 主要作用如下:
阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回;(缓存一致性协议、轻量级同步)
阻止编译器调整操作 volatile 变量的指令排序。
volatile 的应用场景
1.在同硬件交互的时候如果我们通过一个变量映射一个寄存器,那么我们对变量的赋值操作:
regValue = 0xaa;
regValue = 0xbb;
regValue = 0xcc;
如果变量regValue 不用volatile修饰的话会被编译器优化,上述三行代码就变成一句了regValue = 0xcc;。这显然是不能接受的。
2.在多线程的全局变量访问中,如果多个线程要同时访问同一个全局变量regValue ,就容易出现当前线程将此变量优化到寄存器而非在内存,对此变量的读写都是在修改寄存器,而非修改内存。这样就导致其他线程去内存地址中读不到上一个线程对此变量修改的最终数值。
作者:LeetCode
链接:https://leetcode.cn/leetbook/read/cmian-shi-tu-po/vwudo7/
来源:力扣(LeetCode)