volatile使用场景

一、 volatile

告诉编译器:这个变量的值随时可能被外部改变,禁止优化,每次读写必须直接访问内存,绝不使用寄存器缓存。

二、核心效果(C/C++)

  • 禁止编译器优化:不把变量放进寄存器缓存,每次都从内存读/写

  • 保证可见性:外部(硬件/中断/其他线程)修改后,主程序能立刻读到最新值

  • 不保证原子性: volatile 不能替代互斥锁/原子操作

三、工控/嵌入式必用场景

  1. 硬件寄存器(GPIO/定时器/状态寄存器)

// 内存映射的硬件寄存器,必须 volatile

volatile uint32_t* GPIOA_ODR = (uint32_t*)0x40020014;

// 每次写都直接到硬件,不会被优化掉

*GPIOA_ODR |= (1 << 5);

硬件会自动改值,不加 volatile 编译器可能优化成"只写一次"。

  1. 中断与主循环共享变量

volatile bool g_flag = false;

// 中断里改

void TIM2_IRQHandler() {

g_flag = true;

}

// 主循环里读

while (1) {

if (g_flag) { // 每次都读内存,不会死循环

// 处理

g_flag = false;

}

}

不加 volatile ,编译器可能把 g_flag 读进寄存器,循环永远看不到变化。

  1. 多线程共享标志位

volatile bool run = true;

void thread_func() {

while (run) { ... }

}

// 主线程改 run,子线程能立刻看到

run = false;

仅用于简单标志;复杂同步必须用 mutex / atomic 。

相关推荐
XIAOHEZIcode42 分钟前
Ubuntu 终端美化全栈指南:Bash 到 Kitty 踩坑实录
linux·ubuntu·命令行
唐青枫3 小时前
别再只会用 cron:Linux systemd Timer 定时任务实战详解
linux
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK2 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
AlfredZhao2 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
卷无止境2 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境2 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴3 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
戴为沐3 天前
Linux内存扩容指南
linux
zylyehuo3 天前
Linux 彻底且安全地删除文件
linux