有一种情况,我有两个线程都在使用相同的互斥锁。一个线程锁定互斥锁并崩溃。互斥状态是什么?它仍然是锁定的,第二个线程永远不会拥有该互斥锁吗?意味着陷入僵局?
编辑 - 还解释了Linux系统上的pthread案例
答案 0 :(得分:4)
由于您尚未指定操作系统,我将告诉您Win32中会发生什么。
在Win32中,第二个线程在等待已终止的线程拥有的互斥锁时会获得WAIT_ABANDONED。 请注意,接收WAIT_ABANDONED意味着第二个线程已收到互斥锁,因此不会出现死锁。第二个线程应检测到WAIT_ABANDONED结果并验证互斥锁保护的资源是否有效州。如果它可以检测到损坏并且没有检测到任何损坏,则继续安全。如果没有,那么提出某种错误是个好主意。
对于互斥锁的某些实现,无法检测拥有它的线程是否已终止,并最终导致死锁。
对于互斥锁的一些实现,有一种方法可以检测拥有线程是什么,找出拥有线程已经终止,然后获取互斥锁的所有权。
答案 1 :(得分:2)
这当然取决于(至少)两件事:
例如,在Java中,{“1}}块保证在”线程完成对象“时释放 - 无论这意味着什么(参见link)。根据{{3}}文章:
停止线程会导致它解锁已锁定的所有监视器。
好的,synchronized
线程会释放监视器,但是如果某个线程以某种方式消失了,那么它是否“完成了对象”?我没有在任何地方看到这个记录。但显而易见的是某人必须释放锁定的互斥锁,否则他们将陷入僵局;也许某些互斥锁或环境包含在锁定它们的线程不存在的情况下自动释放互斥锁的机制。
另一个例子:this docs建议使用stop()
语句来释放锁,这样无论执行线程发生什么,锁都会被释放。但是,如果线程在执行finally
语句之前消失,那么锁永远不会被释放并且确实发生了死锁。当然,线程不应该像那样“消失”。
相当不错的问题!
答案 2 :(得分:0)
感谢您的回复。 http://msdn.microsoft.com/en-us/library/ms687032%28VS.85%29.aspx MSDN还表示它释放互斥锁并且等待线程获得WAIT_ABANDONED状态。