我正在尝试调试一些Ruby代码中的死锁,但似乎没有加起来。我不是Ruby开发人员,所以也许我在某个地方做一个无效的假设。我想进一步了解Ruby如何执行死锁检测。
以下是我所看到的示例:
::IO:readlines
。wait
上进行ConditionVariable
,第一个工作线程最终将signal
进行操作。join
,首先加入第一个工作线程。join
无法说:
没有活动线程了。僵局? (致命)
死锁检测中未包含正在加入的线程的可能原因是什么?还是这根本不可能,我对真正出问题的理解不正确?
答案 0 :(得分:0)
我的理解不正确。即使从调试日志记录中发现它正在加入第一个线程,也没有。它加入了第一个线程,而第二个导致了死锁。
一旦我确定跟踪第一个线程为何完成但不发信号通知其余线程的原因要简单得多。
这可能是由于puts
缓冲引起的。因此,请flush
输出,将其设置为sync
或展开循环,以使联接出现在不同的行上,并且回溯会告诉您正确的输出。