簡體   English   中英

當獲取它的線程退出時,Mutex會發生什么?

[英]What happens to Mutex when the thread which acquired it exits?

假設有兩個線程,主線程和線程B(由main創建)。 如果B獲得了一個互斥鎖(比如pthread_mutex)並且在沒有解鎖鎖的情況下調用了pthread_exit。 那么互斥體會發生什么? 它變得免費嗎?

不。 互斥鎖保持鎖定狀態。 這種鎖實際發生了什么取決於它的類型,你可以在這里這里閱讀

如果通過在調用pthread_mutex_init之前設置正確的屬性來創建健壯的互斥鎖,則當持有鎖的線程終止時,互斥鎖將進入特殊狀態,並且嘗試獲取互斥鎖的下一個線程將獲得EOWNERDEAD的錯誤。 然后它負責清除互斥鎖保護的任何狀態,並調用pthread_mutex_consistent以使互斥鎖再次可用,或調用pthread_mutex_unlock (這將使互斥鎖永久不可用;進一步嘗試使用它將返回ENOTRECOVERABLE )。

對於非健壯的互斥鎖,如果鎖定它的線程終止而未解鎖,則互斥鎖將永久不可用。 根據標准(參見在Austin Group跟蹤器上發布755的決議),互斥鎖保持鎖定狀態,其正式所有權繼續屬於退出的線程,並且任何試圖鎖定它的線程都將死鎖。 如果另一個線程試圖解鎖它,那通常是未定義的行為,除非使用PTHREAD_MUTEX_ERRORCHECK屬性創建互斥鎖,在這種情況下將返回錯誤。

另一方面,許多(大多數?)現實世界的實現實際上並不符合標准的要求。 嘗試從另一個線程鎖定或解鎖互斥鎖可能會虛假成功,因為線程ID(用於跟蹤所有權)可能已被重用,現在可能引用另一個線程(可能是發出新鎖定/解鎖請求的線程)。 至少glibc的NPTL已經表現出這種行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM