volatile 关键字作用:
-
防止编译器优化
- 告诉编译器该变量可能被意外修改
- 禁止对 volatile 变量的访问进行优化
- 每次访问都从内存中读取最新值
-
保证内存可见性
- 确保多线程或中断环境下的数据一致性
- 防止寄存器缓存导致的读取延迟
典型使用场景:
- 硬件寄存器访问
cvolatile uint32_t *status_reg = (uint32_t*)0x40000000; while (*status_reg & 0x01) { // 等待硬件状态变化 }
- 多线程共享变量
cvolatile int flag = 0; void thread1() { flag = 1; // 通知其他线程 } void thread2() { while (!flag) { // 等待标志变化 } }
- 中断服务程序
cvolatile int interrupt_flag = 0; void ISR() { interrupt_flag = 1; } int main() { while (!interrupt_flag) { // 主循环等待中断 } }
- 信号处理
cvolatile sig_atomic_t signal_received = 0; void handler(int sig) { signal_received = 1; }
注意事项:
-
volatile 不是原子操作
- 不保证多线程安全
- 需要配合锁机制使用
-
性能影响
- 频繁访问可能降低性能
- 仅在必要时使用
-
不能替代同步机制
- 不提供互斥访问保证
- 不解决竞态条件问题