多线程循环控制字段失效造成死循环的坑

编程的时候遇到一个场景:

  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关键字,就不会有这个问题,循环判断每次都取内存的值

 

posted @ 2024-05-14 11:31  Bennettz  阅读(12)  评论(0编辑  收藏  举报