如何检测挂起的线程?

时间:2009-04-14 20:02:30

标签: multithreading

是否可以检测到挂起的线程?这个线程不是任何线程池的一部分,它只是一个系统线程。由于线程挂起,它可能不会处理任何事件。

谢谢,

3 个答案:

答案 0 :(得分:3)

理论上,它是impossible。如果您在Windows上并且怀疑该线程可能已死锁,我猜您可以使用GetThreadContext几次并检查它是否始终相同,但我不知道它有多可靠。

答案 1 :(得分:1)

不是理论上的,但在实践中,可能会有所不同,具体取决于您的工作量。例如,如果它应该响应事件,您可以发布一个线程消息(在Windows中)并查看它是否响应。您可以设置一个事件或标志,使其执行某些操作 - 然后您必须等待“合理”的时间来查看它是否已响应。那么问题就出现了你对“挂”线程所做的事情,即使它已经真正挂起并且不仅需要很长时间才能做出响应。通常不能安全地杀死线程,并且通常不能中断任意线程。记录一条消息是否足够安全,但谁会关心?可能最好的做法是记下它并找出导致它挂起的错误。

答案 2 :(得分:0)

根据工作负载和完成的处理类型以及其他细节,可以检测挂起的线程。在某些情况下,现代VM可以检测到锁定死锁,其中两个线程挂起,等待另一个线程释放锁定。 (但不要依赖于此,因为有时并非总是可行。)

在我们对您的问题给出具体答案之前,我们需要更多信息。