12 条回复  ·  1339 次点击
mmdsun 小成 昨天 12:51
C 语言多线程经典 BUG 了。 让 ai 写一个 c 语言多线程自旋代码吧。不用原子锁条件变量肯定爆炸
w568w 小成 昨天 13:05
推荐阅读: https://davekilian.com/acquire-release.html
chenyu0x00 初学 昨天 13:05
这个不是多线程的 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 还解决了多线程情况下的内存序的问题。
12
返回顶部