GoForum🌐 V2EX

分享一个代码优化导致的死循环

echoechoin · 2026-01-04 10:48 · 0 次点赞 · 1 条回复

现象: gdb bt 卡在 spinlock_unlock() 位置。

  1. 查了半天代码,我的每一个锁都没有问题。给我看吐血了。

  2. 最后没辙了灵机一动 gdb disassemble 发现这里死循环了:

gdb disassemble

原来是一个标志位没有设置为 volatile ,代码被优化了。大概的代码如下:

while (true) {
    // 多线程中可以被修改的一个标志
    if (flags_1 == STATUS_1) { 
        continue
    }
    // 其他逻辑
    // ... ...
}

但是为什么不是必现的 BUG 呢? AI 给了一堆解释,但是没怎么看懂。

1 条回复
anytk · 2026-01-04 11:08
#1

跨线程的话,一般推荐用原子变量来做标志,内存序可以用 relaxed.

volatile 基本留给硬件寄存器读写和 sig_atomic_t 了.

添加回复
你还需要 登录 后发表回复

登录后可发帖和回复

登录 注册
主题信息
作者: echoechoin
发布: 2026-01-04
点赞: 0
回复: 0