如果我有一个应用程序正在创建执行其工作然后退出的线程,并且一个或多个线程陷入死锁(可能不是我自己的错!),有没有一种方法可以通过编程方式强制执行其中一个提前经过WaitForSingleObject的线程可能会被卡住,从而解决死锁问题?
我不一定要终止该线程,我只想让它继续运行(从而允许线程“优雅地”退出。
(是的,我知道这听起来像我之前的问题Delphi 2006 - What's the best way to gracefully kill a thread and still have the OnTerminate handler fire?的重复,但情况略有不同 - 我在这里要问的是,是否有可能使WaitForSingleObject (Handle, INFINTE)
表现出来比如WaitForSingleObject (Handle, ItCantPossiblyBeWorkingProperlyAfterThisLong)
)。
请对我温柔。
*更多信息*
问题不一定在我有源代码的代码中。实际情况是基于线程的串行COM端口库(AsyncFree)。当端口基于USB时,库在关闭端口时创建的两个线程之间似乎存在死锁。我已经在this forum详细讨论了这个问题。我确实将其中一个WaitForSingleObject调用重新编码为无限,并且已经解决了这个死锁,但是后来在线程关闭序列中出现了另一个,这次是在Delphi TThread.Destroy例程中。
所以我的理由很简单:当我的线程死锁时,如果可以,我会修复代码。如果我不能,或者看起来我不知道,我只想让线程完成。我不一定很漂亮。我不能让我的应用程序窒息。
答案 0 :(得分:5)
您可以通过关闭WaitForSingleObject
中的句柄来使其无效(来自其他某个帖子)。在这种情况下,WaitForSingleObject
应返回WAIT_FAILED
,您的广告将“移动”
答案 1 :(得分:4)
如果您不使用INFINITE但只设置了一个给定的超时时间,您可以检查是否因为超时时间到期或者您等待的句柄进入信号状态而返回了呼叫。然后您的代码可以决定下一步该做什么。进入另一个等待周期,或者只是退出,或者只是退出可能显示某个地方'嘿,我在等,但它太长了,无论如何我终止了)。 另一个选择是使用WaitForMultipleObjects并使用类似事件的东西来等待终止(如果需要)。它的优点是不需要超时到期。 当然,一个线程被唤醒它必须能够处理“异常”状态继续,即使它正在等待的“主”句柄没有及时返回。