正常情况下,在终端编译执行该多线程程序,首先打印n(0),5秒后再次打印n(1),然后该进程正常退出。
但,如果使用gcc编译此程序时,使用优化选项(比如-O1),再执行此程序。首先打印n(0),5秒后再次打印n(1),然后呢,然后就死循环啦!
为什么呢?看一看汇编代码就知道了,使用gcc -O1 -S命令编译第一段代码,得到的汇编码:
1 2 3 4 5 6 7 | main: movl n(%rip), %eax #从内存中取n值至寄存器eax .L3: testl %eax, %eax # 与测试eax je .L3 # eax为0时跳转至标号L3处 movl $0, %eax ret |
真相大白了吧,那该怎么办?对,volatile,参看这里。