多线程循环控制字段失效造成死循环的坑
编程的时候遇到一个场景:
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关键字,就不会有这个问题,循环判断每次都取内存的值