如何发现死锁??
·
目录
💡 一、为什么“程序卡住但 CPU 很低”?
👉 因为线程在等锁。
锁没释放,它就一直卡着,不做事,也不占 CPU。
比喻:
你在排队领饭,一直站着不动(等别人),你不干活(CPU 不忙),
但你也没走(程序没崩),这就是“死锁”状态。
所以如果程序:
-
不崩溃、不报错、也不继续运行
-
CPU 占用几乎 0%
那通常就是线程互相卡住了。
🧰 二、用调试工具去“看看线程在干嘛”
死锁最准确的判断方法:
👉 看“每个线程卡在哪里”。
🔹 在 Linux 或 macOS 上
1️⃣ 找到程序的进程号(PID):
ps aux | grep 程序名
2️⃣ 把调试器 gdb 附到这个进程:
gdb -p <PID>
3️⃣ 输入命令:
(gdb) thread apply all bt
意思是:
“把所有线程(thread)都列出来,显示它们的调用栈(backtrace)。”
🔍 看输出结果(重点!)
如果你看到很多线程停在类似这样的地方:
pthread_mutex_lock
futex_wait
这些都是“等待锁”的系统函数。
🧠 翻译成人话就是:
“这些线程正在等别人释放锁”
如果多个线程都互相卡在这些函数 → 就是死锁。
🔹 在 Windows 上
1️⃣ 用 Visual Studio 打开正在运行的程序(Debug 模式)
2️⃣ 点击菜单栏:
调试 → 窗口 → 并行堆栈(Parallel Stacks)
3️⃣ 你会看到每个线程的调用栈图:
-
哪个线程在执行哪行代码
-
哪个线程卡在等待锁
如果看到两个线程互相等待 → 就是死锁。
🧠 总结一口气讲清楚:
| 你看到的现象 | 说明 |
|---|---|
| 程序卡住但 CPU 很低 | 线程都在等锁(没崩溃、没运行) |
GDB/VS 看到很多线程卡在 pthread_mutex_lock 或 futex_wait | 它们都在等别人释放锁 |
| 多个线程互相等待 | ✅ 确认是死锁 |
更多推荐


所有评论(0)