目录
- volatile
- 1)基本概念
- 2)用途:禁止编译器优化
- 3)总结
volatile
1)基本概念
const
是C语言的一个关键字。
const
用于告诉编译器相应的变量可能会在程序的控制之外被修改,因此编译器不应该对其进行优化。
声明语法:
volatile int A;
作用:
- 防止编译器优化,确保对变量的每次访问都是实际的读写操作,而不是使用缓存中的值。
- 用于表示可能会被异步修改的变量,如硬件寄存器、中断服务程序中的共享变量等。
2)用途:禁止编译器优化
在学习这个知识点前,需要大概了解下代码运行的实质。
对于一个简单的乘法运算a = a * b
在RISC中要使用4条汇编指令:
① 读内存中的a
② 读内存中的b
③ 在CPU中计算a*b
④ 把结果写回内存
问题:正常流程是上面的四步,但是,编译器可能会对变量的读写进行优化,例如将变量A
缓存在CPU自己的寄存器中,下次使用的时候直接读CPU寄存器中的A
,而不去读内存中的A
,但内存中的A
可能已经发生了变化,这样可能导致无法正确地捕捉到变量的实际变化。
为了解决这种问题,用volatile
去修饰A
,volatile int A;
就可以禁止编译器优化,确保对变量的每次访问都是实际的读写操作。
这种BUG一般发生在多线程环境中,全局变量等共享量,没有管理好。
3)总结
volatile
的使用需要谨慎,特别是在多线程编程中,建议使用专门设计用于同步的机制来保障正确性。
volatile
不能替代更强大的同步手段,如互斥锁、原子操作等。