一个因为没有用volatile产生的bug

代码在O1优化等级下编译。

有一行代码如下:

while(!test_start);

test_start是一个全局变量,初始值为0。某个线程会令该变量值为1,结束循环,但运行时并没有结束循环。

于是开始进行调试,发现test_start确实已经是1了,但该行代码却一直在循环中,于是查看了一下汇编代码:

 

 发现第三行汇编,当判断r3等于0时,继续重复执行该行代码,于是想到可能是因为优化后不从内存中读值,加上volatile后汇编代码如下:

 

这个时候,当r3等于0时,跳转到第二行执行,重新从r2存储的地址处取值,然后再进行判断。 

 

posted @ 2022-01-20 20:05  一只吃水饺的胡桃夹子  阅读(57)  评论(0编辑  收藏  举报