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 。

相关推荐
唠玖馆1 小时前
文件系统详解
linux·文件系统·ext2
GeW1 小时前
当Linux内核开始“确定性”,制造高端化才有了底层语法
linux
David猪大卫2 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger2 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
星恒随风2 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
fengci.3 小时前
CTF2MISC中等部分
开发语言·前端·学习
StarsGreen4 小时前
libva在intel平台上的前端流程简介
linux
xys_6785 小时前
JavaEE通关手册:初识Java
java·开发语言
努力努力再努力wz5 小时前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
慧都产品智能化5 小时前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3