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 。

相关推荐
FRing032 小时前
JavaScript入门到精通二十四(正则表达式、元字符、修饰符)
开发语言·前端·javascript·正则表达式
西索斯coding2 小时前
Grok 4.7 调用一直 401 怎么办?不是 Key 过期,是 Authorization 头格式问题——排查全流程 + 修复示例
服务器·开发语言·ai·php
yunwei372 小时前
eBPF 示例:使用 CUPTI 构建 GPU 火焰图分析器
linux·后端·性能优化
const_qiu3 小时前
第四章 07:4.7 本章小结
java·运维·服务器·人工智能
张宇Joaquin3 小时前
自研SP600系列网卡驱动跟麒麟V10 SP3 2403配套关系
linux·运维·网络
himobrinehacken3 小时前
位运算揭秘:左右移与符号位陷阱
c语言·c++·算法·安全
SEO_juper3 小时前
hreflang 审计工具:外贸多语言站谷歌SEO的隐性杀手
开发语言·人工智能·爬虫·python·seo
WJ.Polar3 小时前
final、单例类、枚举类、抽象类、接口
java·开发语言
mengge.cloud3 小时前
1019Namespace ,Contexts ,Kubernetes Pod
运维·服务器·网络·云原生·容器·kubernetes·云计算
小羊没烦恼!3 小时前
C#综合揭秘——Entity Framework 并发处理详解
java·开发语言·前端·javascript·数据库·mysql·c#