为什么在 Ruby 中的死锁检测中可能缺少已加入的线程?
Why might a joined thread be missing from deadlock detection in Ruby?
我正在尝试调试某些 Ruby 代码位中的死锁,有些东西似乎没有加起来。我不是 Ruby 开发人员,所以我可能在某处做出了无效的假设。我想进一步了解 Ruby 如何执行死锁检测。
这是我所看到的示例:
- 有 9 个线程。第一个是主线程和当前线程。其他 8 个是工作线程。
- 第一个工作线程关闭并执行其操作并最终到达
::IO:readlines
。
- 接下来的 4 个开始一些事情,然后
wait
在 ConditionVariable
上,第一个工作线程最终将 signal
.
- 其余3人无事可做,停止
- 现在主线程在启动所有工作线程后调用
join
,首先加入第一个工作线程。
- 这个
join
没有说:
No live threads left. Deadlock? (fatal)
- 然后打印出5个线程,1个是主线程,另外4个是等待的4个worker。第一个工作线程丢失。
- 第一个工人还活着,它在错误发生后继续做它的事情。
正在加入的线程未包括在死锁检测中的可能原因是什么?或者这根本不可能,我对真正发生的事情的理解是错误的?
我的理解不正确。即使从调试日志记录显示它正在加入第一个线程,但事实并非如此。它加入了第一个线程,是第二个线程导致了死锁。
一旦我发现跟踪第一个线程完成但未向其余线程发出信号的原因要简单得多。
这可能是由 puts
缓冲引起的。因此,要么 flush
输出,将其设置为 sync
,要么展开循环,以便连接出现在不同的行上,回溯会告诉你正确的。
简而言之,相信死锁的结果。如果它与您的假设相冲突,请验证您的假设。
我正在尝试调试某些 Ruby 代码位中的死锁,有些东西似乎没有加起来。我不是 Ruby 开发人员,所以我可能在某处做出了无效的假设。我想进一步了解 Ruby 如何执行死锁检测。
这是我所看到的示例:
- 有 9 个线程。第一个是主线程和当前线程。其他 8 个是工作线程。
- 第一个工作线程关闭并执行其操作并最终到达
::IO:readlines
。 - 接下来的 4 个开始一些事情,然后
wait
在ConditionVariable
上,第一个工作线程最终将signal
. - 其余3人无事可做,停止
- 现在主线程在启动所有工作线程后调用
join
,首先加入第一个工作线程。 - 这个
join
没有说:No live threads left. Deadlock? (fatal)
- 然后打印出5个线程,1个是主线程,另外4个是等待的4个worker。第一个工作线程丢失。
- 第一个工人还活着,它在错误发生后继续做它的事情。
正在加入的线程未包括在死锁检测中的可能原因是什么?或者这根本不可能,我对真正发生的事情的理解是错误的?
我的理解不正确。即使从调试日志记录显示它正在加入第一个线程,但事实并非如此。它加入了第一个线程,是第二个线程导致了死锁。
一旦我发现跟踪第一个线程完成但未向其余线程发出信号的原因要简单得多。
这可能是由 puts
缓冲引起的。因此,要么 flush
输出,将其设置为 sync
,要么展开循环,以便连接出现在不同的行上,回溯会告诉你正确的。
简而言之,相信死锁的结果。如果它与您的假设相冲突,请验证您的假设。