多线程循环控制字段失效造成死循环的坑
编程的时候遇到一个场景:
A,B两个线程,B是一个while(flag),有个控制字段flag,刚开始是true
B会一直循环,A某个情况回把flag置为false,但是如果B的循环里什么都没干,就一直不退出,陷入死循环
本来以为是哪里逻辑写错了,于是在B里面加入了一个printf,没想到结果就能正常退出了
当时觉得很奇怪,推测可能是cpu的原因,因为cpu死循环时候占用率100%可能无法更新缓存中的内容,
推测调用printf修复的原因是printf进行系统调用后刷新了缓存。
不过后来学习后发现x86架构没有invalid队列,A线程更改flag刷入内存后,B线程应该能立马感知到变化,并让本地缓存失效
最后咨询了同事,发现是编译器的问题。
如果循环里什么都不写,就会先获取flag到寄存器,以后每次循环判断时直接比较寄存器的值
如果循环里加上一些东西,或者flag加上volatile关键字,就不会有这个问题,循环判断每次都取内存的值
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版