2010-12-12 51 views

回答

14

nope。互斥体仍然被锁定。究竟发生了这样的锁取决于其类型,你可以阅读有关herehere

+0

Merci Beaucoup !!!非常感谢 !!! – Sadish 2010-12-12 21:43:47

+0

另一个线程无法解锁它,除非它是一个强大的互斥锁。 – 2010-12-12 22:08:13

+0

哇,一个没有线程亲和力的'互斥'?没有“被遗弃”的错误状态? – 2010-12-12 22:10:24

10

如果在调用pthread_mutex_init之前创建通过建立正确的属性强大的互斥体,互斥体将进入当一种特殊状态保存锁的线程终止,下一个尝试获取互斥锁的线程将获得错误EOWNERDEAD。然后它负责清除互斥锁保护的任何状态,并呼叫pthread_mutex_consistent使互斥锁再次可用,或者调用pthread_mutex_unlock(这会使互斥锁永久不可用;进一步尝试使用它将返回ENOTRECOVERABLE)。

对于不可靠的互斥锁,如果锁定它的线程在未解锁的情况下终止,则该互斥锁永久不可用。根据标准(请参阅奥斯汀集团跟踪器上issue 755的决议),互斥锁保持锁定状态,其正式所有权继续属于退出的线程,任何试图锁定它的线程都会死锁。如果另一个线程试图解锁它,那通常是未定义的行为,除非互斥体是使用PTHREAD_MUTEX_ERRORCHECK属性创建的,在这种情况下将返回一个错误。另一方面,许多(大多数?)真实世界的实现实际上并不遵循标准的要求。尝试从另一个线程锁定或解锁互斥锁可能会虚假成功,因为线程ID(用于跟踪所有权)可能已被重用,并且现在可能引用另一个线程(可能是发出新的锁定/解锁请求的线程)。已知至少glibc的NPTL表现出这种行为。

相关问题