为什么在Ruby的死锁检测中可能缺少联接的线程?

时间:2019-07-02 20:49:00

标签: ruby deadlock

我正在尝试调试一些Ruby代码中的死锁,但似乎没有加起来。我不是Ruby开发人员,所以也许我在某个地方做一个无效的假设。我想进一步了解Ruby如何执行死锁检测。

以下是我所看到的示例:

  • 有9个线程。第一个是主线程和当前线程。其他8个是工作线程。
  • 第一个工作线程关闭并执行其操作,最终进入::IO:readlines
  • 接下来的4个程序开始工作,然后在wait上进行ConditionVariable,第一个工作线程最终将signal进行操作。
  • 另外3个无关紧要的事情。
  • 现在,主线程在启动所有工作线程后会在所有工作线程上调用join,首先加入第一个工作线程。
  • join无法说:
      

    没有活动线程了。僵局? (致命)

  • 然后打印出5个线程,其中1个是主线程,其他4个是正在等待的4个工人。第一个工作线程丢失。
  • 第一个工人还活着,它在发生错误后继续做自己的事情。

死锁检测中未包含正在加入的线程的可能原因是什么?还是这根本不可能,我对真正出问题的理解不正确?

1 个答案:

答案 0 :(得分:0)

我的理解不正确。即使从调试日志记录中发现它正在加入第一个线程,也没有。它加入了第一个线程,而第二个导致了死锁。

一旦我确定跟踪第一个线程为何完成但不发信号通知其余线程的原因要简单得多。

这可能是由于puts缓冲引起的。因此,请flush输出,将其设置为sync或展开循环,以使联接出现在不同的行上,并且回溯会告诉您正确的输出。

简而言之,请信任死锁的输出。如果与您的假设相抵触,请验证您的假设。