Summarize 总结
- 声明为volatile的变量,阻止compiler的任何优化,因为变量会以compiler无法预测的方式改变。
- 每次都读取内存(主内存)中的值,而不是CPU的Register(寄存器、高速缓冲、工作内存),即使CPU运行的指令是对 同一variable操作
Literally 语义
- volatile: 挥发物;易挥发的,反复无常的
- in program context: 数值易于改变的变量
使用场景
那什么情景 变量以 compiler无法预测的形式改变呢?
- 多线程应用中的 全局变量。和上文一样,也是register中缓存导致。导致线程之间 数据不一致。
- 全局变量 被超出scope(范围、作用域)的ISR(Interrupt Service Routine 中断式服务程序)改变)。
- 例如:全局变量是 data port(数据端口,通常是 memory mapped 的全局指针),且该data port可动态更新。 必须将data port声明为volatile,以便获读取data port的最新数据。 否则,编译器会 只读取一次数据,并存入register中,然后使用register中的数值 来加速程序(速度优化)。 但通常,ISR会在中断发生时改变数据