2012-02-08 39 views
4

這是一個面試問題。在Linux上,如何確保解鎖鎖定在死亡/終止線程中的互斥鎖?

在Linux上,如何確保解鎖POSIX互斥體,該互斥體被鎖定在死亡/終止的POSIX線程中?

我的想法:

Linux會自動釋放它時,它發送終止或終止信號發送到程序?但是,我無法找到關於操作系統如何操作的更多細節?

謝謝

+0

還有其他的上下文嗎?線程如何完全死亡? – Tudor 2012-02-08 18:13:52

+0

互斥體是如何實現的? POSIX或SysV信號量? – 2012-02-08 18:52:23

回答

14

A 強大的互斥鎖可以用來處理互斥鎖的擁有者在持有互斥鎖時終止的情況,這樣就不會發生死鎖。這些比常規互斥鎖有更多開銷,並且要求鎖定互斥鎖的所有客戶端都準備好處理錯誤代碼EOWNERDEAD。這表明前所有者已經死亡,並且接收此錯誤代碼的客戶端是新所有者,並負責清除任何不一致的狀態。

健壯的互斥體是一個具有健壯屬性集的互斥體。在Linux上,可以使用pthread_mutexattr_setrobust_np(&attr, PTHREAD_MUTEX_ROBUST_NP)或使用POSIX標準函數pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST)來設置,如果您有glibc 2.12或更高版本(此功能在POSIX.1-2008中進行了標準化)。

4

如果它不是一個進程共享的互斥量,那並不重要。當一個線程死亡時,該進程死亡,並且該互斥體消失。

如果它是一個進程共享的互斥量,那麼你問的是錯誤的問題。你不會想要解鎖互斥體,如果一個線程死亡,而按住它。線程持有互斥鎖的原因是,它可以通過其他線程不能看到的狀態來操作共享數據。如果線程在持有互斥鎖時死亡,那麼數據很可能會處於這種不一致的狀態。解鎖互斥鎖只會讓其他線程看到無效/損壞的數據。

+0

我無法在自己的腦海中表達自己的想法,但是對於這個問題似乎沒有任何意義。你擊中了頭部,imho。 – 2012-02-08 19:06:50

+0

我想總有這種情況,當線程乾淨地退出,但程序員的錯誤鎖定了一個互斥體。如果可能的話,你肯定希望從中恢復過來。這一定是我還沒有完成正確的編程類型,因爲我從來沒有遇到過這種情況。 – 2012-02-09 13:23:45

+0

@SanJacinto你不可能知道這是錯誤,而不是讓互斥鎖保護的數據處於不一致的狀態。您必須假定共享數據已損壞。您可以處理這種情況,但它需要代碼來修復共享數據的任何問題,或者不嘗試在沒有共享數據的情況下運行(可能儘可能乾淨地關閉並重新啓動)。 – 2012-02-09 22:10:23