|
这个不是多线程的 bug ,这个是 C/C++编译器的"特性"。
相当于有这样一段代码:
```c++
int flag;
while (flag == 0) {
}
```
编译器在不进行优化(-O0)的情况下,每次 while 循环都会从内存中读 flag 的值,并和 0 进行判断。
当使用了编译器优化的情况下,编译器就会发现"这个程序员真 SB ,为什么每次都要从内存中读 flag 的值呢,我直接读一次,放到寄存器里面,之后访问速度就更快了,判断也可以优化成一次",于是代码就变成这样了:
```c++
register eax = flag;
if (eax == 0) {
while (true) {
}
}
```
你会发现这个优化在单线程的情况下是完全没有问题的,在多线程情况下就出问题了。
而使用 volatile int flag 就是告诉编译器"不要偷懒,我让你从内存读 flag 你就从内存读,让你写到内存就写到内存"。
不过如上面所说,建议多线程通信使用 atomic ,因为 atomic 还解决了多线程情况下的内存序的问题。 |