GoForum › 🌐 V2EX
分享一个代码优化导致的死循环
echoechoin ·
2026-01-04 10:48 ·
0 次点赞 · 1 条回复
现象: gdb bt 卡在 spinlock_unlock() 位置。
查了半天代码,我的每一个锁都没有问题。给我看吐血了。
最后没辙了灵机一动
gdb disassemble发现这里死循环了:

原来是一个标志位没有设置为 volatile ,代码被优化了。大概的代码如下:
while (true) {
// 多线程中可以被修改的一个标志
if (flags_1 == STATUS_1) {
continue
}
// 其他逻辑
// ... ...
}
但是为什么不是必现的 BUG 呢? AI 给了一堆解释,但是没怎么看懂。
1 条回复
添加回复
你还需要 登录
后发表回复
跨线程的话,一般推荐用原子变量来做标志,内存序可以用 relaxed.
volatile 基本留给硬件寄存器读写和 sig_atomic_t 了.