2010-07-02 30 views
5

有情况,我有两个线程都使用相同的互斥体。一个线程锁定了互斥锁并崩溃。什么是互斥状态?它是否仍然被锁定,并且第二个线程从未拥有该互斥锁?意味着僵局?线程与锁定的互斥体崩溃

编辑 - 也可以在Linux系统

+2

请提供更多信息。 – InsertNickHere 2010-07-02 07:29:24

回答

3

既然你没有指定什么操作系统,我会告诉你在Win32中会发生什么解释并行线程的情况。

在Win32中,第二个线程在等待终止的线程所拥有的互斥量时将获得WAIT_ABANDONED。 请注意,接收WAIT_ABANDONED意味着第二个线程已收到互斥量,所以不会发生死锁。第二个线程应检测到WAIT_ABANDONED结果,并验证由互斥锁保护的资源是否处于有效状态。如果它可以检测到腐败并且没有发现任何问题,那么继续下去是安全的。如果没有,提出某种错误是个好主意。

对于互斥锁的某些实现,无法检测到拥有它的线程已终止,并且最终导致死锁。

对于互斥锁的某些实现,有一种方法可以检测拥有的线程是什么,找出拥有的线程已终止,然后获取互斥锁的所有权。

+1

在一些实现中,您可以定义等待时间或者创建自己的包装器方法......无论如何,线程挂起在经典实现中对互斥量\信号量没有影响,因此检查等待时间并引发超时异常或恢复执行是个不错的主意。 – Oleksandr 2010-07-02 08:12:21

+0

对不起,有一半的问题。这是在Windows操作系统上,也喜欢了解其他操作系统的行为。 Gabe:如果总是获得WAIT_ABANDONED,那么很容易就可以处理。再次,是否存在僵局? 我们如何检测到所有者线程崩溃。 Joonas Pulakka: 只假设线程与NULL崩溃。意味着没有例外或没有任何承认。 – CrazyC 2010-07-02 09:06:26

2

这当然取决于(至少)两两件事:

  • 如何互斥的实施,并
  • 如何线程崩溃(它抛出一个异常,还是只是“消失”) 。

例如,在Java的​​块保证当“线程这个对象”被释放 - 这意味着什么(见link)。根据this文章:

停止一个线程导致它解锁它已经锁定的所有监视器。

好的,stop() ing线程释放显示器,但是如果一个线程只是以某种方式消失了,它会“完成对象”吗?我没有看到这在任何地方记录。但很显然,某人必须释放锁定的互斥锁,否则它们会死锁;也许一些互斥体或环境包括一些机制,如果锁定它们的线程变得不存在,它们会自动释放互斥体。

另一个示例:java.util.concurrent.Lock文档建议使用finally语句释放锁,以便无论执行线程发生什么情况,锁都会释放。但是,如果线程在finally语句执行之前消失,那么锁定永远不会被释放,并且确实会发生死锁。当然,线程不应该像那样“消失”。

不错的问题!

+0

问题是好的,但每个实现都有自己的机制和解决方案来解决所描述的问题,但我们只能猜测作者的意思:) – Oleksandr 2010-07-02 08:15:23