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 。

相关推荐
墨风如雪18 小时前
甲骨文云(Oracle Cloud)最新注册防坑记录:被ABC了怎么办?
服务器
JAVA面经实录91719 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
HHFQ20 小时前
在 systemd 场景下的 CPU 限制方式
linux
道清茗20 小时前
【RH294知识点汇总】第 9 章 《 自动执行 Linux 管理任务 》常见问题
linux·运维·服务器
山羊硬件Time20 小时前
自动化管理Linux的好工具:shell script
linux·嵌入式硬件·硬件工程师·基带工程·硬件开发
王老师青少年编程20 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
周杰伦fans20 小时前
AutoCAD .NET 二次开发:深入理解 EntityJig 的工作原理与正确实现
开发语言·.net
叼烟扛炮20 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
wj30558537821 小时前
Codex + Git 开发环境配置指南(WSL版)
linux·运维·git
星马梦缘21 小时前
如何切换window-ubuntu双系统【方案二】
linux·运维·ubuntu