为什么在 Ruby 中的死锁检测中可能缺少已加入的线程?

Why might a joined thread be missing from deadlock detection in Ruby?

我正在尝试调试某些 Ruby 代码位中的死锁,有些东西似乎没有加起来。我不是 Ruby 开发人员,所以我可能在某处做出了无效的假设。我想进一步了解 Ruby 如何执行死锁检测。

这是我所看到的示例:

正在加入的线程未包括在死锁检测中的可能原因是什么?或者这根本不可能,我对真正发生的事情的理解是错误的?

我的理解不正确。即使从调试日志记录显示它正在加入第一个线程,但事实并非如此。它加入了第一个线程,是第二个线程导致了死锁。

一旦我发现跟踪第一个线程完成但未向其余线程发出信号的原因要简单得多。

这可能是由 puts 缓冲引起的。因此,要么 flush 输出,将其设置为 sync,要么展开循环,以便连接出现在不同的行上,回溯会告诉你正确的。

简而言之,相信死锁的结果。如果它与您的假设相冲突,请验证您的假设。