假設有兩個線程,主線程和線程B(由main創建)。如果B獲得了一個互斥體(如pthread_mutex),並且它已經調用pthread_exit而不解鎖該鎖。那麼互斥體會發生什麼?它是免費的嗎?當獲取它的線程退出時,Mutex會發生什麼?
15
A
回答
14
10
如果在調用pthread_mutex_init
之前創建通過建立正確的屬性強大的互斥體,互斥體將進入當一種特殊狀態保存鎖的線程終止,下一個嘗試獲取互斥鎖的線程將獲得錯誤EOWNERDEAD
。然後它負責清除互斥鎖保護的任何狀態,並呼叫pthread_mutex_consistent
使互斥鎖再次可用,或者調用pthread_mutex_unlock
(這會使互斥鎖永久不可用;進一步嘗試使用它將返回ENOTRECOVERABLE
)。
對於不可靠的互斥鎖,如果鎖定它的線程在未解鎖的情況下終止,則該互斥鎖永久不可用。根據標準(請參閱奧斯汀集團跟蹤器上issue 755的決議),互斥鎖保持鎖定狀態,其正式所有權繼續屬於退出的線程,任何試圖鎖定它的線程都會死鎖。如果另一個線程試圖解鎖它,那通常是未定義的行爲,除非互斥體是使用PTHREAD_MUTEX_ERRORCHECK
屬性創建的,在這種情況下將返回一個錯誤。另一方面,許多(大多數?)真實世界的實現實際上並不遵循標準的要求。嘗試從另一個線程鎖定或解鎖互斥鎖可能會虛假成功,因爲線程ID(用於跟蹤所有權)可能已被重用,並且現在可能引用另一個線程(可能是發出新的鎖定/解鎖請求的線程)。已知至少glibc的NPTL表現出這種行爲。
相關問題
- 1. 當JVM退出時,堆中的對象會發生什麼?
- 2. 當FlatFileFooterCallback出錯時會發生什麼?
- 3. 線程試圖獲取pthread_mutex_lock(&mutex)如果他們沒有獲取鎖,會發生什麼?
- 4. 當SIGCANCEL發送到線程時會發生什麼?
- 5. 當Docker容器的PID1退出時,其他進程會發生什麼?
- 6. 未能獲取鎖的線程會發生什麼情況?
- 7. 當主線程終止時,SynchronizationContext會發生什麼?
- 8. 當某個線程調用Thread.interrupt()時,會發生什麼?
- 9. 什麼是H.450.2?當它不存在時會發生什麼?
- 10. 取消時線程的內存會發生什麼變化?
- 11. 當程序運行時發生事件時會發生什麼
- 12. ASP.Net的自動回發。當它太慢時會發生什麼?
- 13. 當父線程退出時,Python守護進程線程不會退出
- 14. .NET線程拋出異常時會發生什麼?
- 15. 當線程意外退出時拋出什麼異常?
- 16. 線程什麼時候退出?
- 17. 當一個線程完成其互斥量時,線程會發生什麼?
- 18. 當主線程調用sys.exit()時,其他線程會發生什麼?
- 19. 當一個線程被阻塞時,其他線程會發生什麼?
- 20. 當第一個線程鎖定類時第二個線程會發生什麼
- 21. 當線程T1加入線程T2和T2時會發生什麼事情會發生中斷
- 22. 發生,當它退出函數
- 23. 當:: thread :: wait存在時,爲什麼我的tcl線程退出?
- 24. 如果當前線程崩潰,那麼readwritelock會發生什麼
- 25. 當主線程退出時,如何讓子線程退出?
- 26. 當一個事件從一個任務中被觸發時會發生什麼?它會有單獨的線程?
- 27. 當主線程針對另一個調度隊列發出dispatch_sync時,主隊列/主線程會發生什麼?
- 28. 線程結束後會發生什麼?
- 29. ConcurrentHashMap.clear()讀線程會發生什麼?
- 30. 當它被克隆時,關閉的delagate會發生什麼?
Merci Beaucoup !!!非常感謝 !!! – Sadish 2010-12-12 21:43:47
另一個線程無法解鎖它,除非它是一個強大的互斥鎖。 – 2010-12-12 22:08:13
哇,一個沒有線程親和力的'互斥'?沒有「被遺棄」的錯誤狀態? – 2010-12-12 22:10:24