2010-12-12 81 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表現出這種行爲。

相關問題