2014-01-06 129 views
2

嗯,這個主題並不像看起來那麼簡單。我們知道mutex可以通過一個信號量來實現,初始計數= 1。
但通過幾篇文章去,我還發現,努力大量已經進入分離這兩個,治療mutex作爲一個獨立的概念,從semaphore
問題Priority Inversion不同,其導致的priority inheritance一個新的概念,有點讓我感到困惑。
信號量和互斥量在優先級反轉方面的區別(也可能是優先級繼承)

也有人提到ownership(如出現在what-is-mutex-and-semaphore-in-java-what-is-the-main-difference)的互斥體。那麼ownership是不好的名詞。 Mutex絕不是共享資源的所有者。 Holding a LockReleasing a Lock,是有效的信令,或許象方式,*Hey wait !! Till I complete and signal you*

尋找具有導致Mutex從分離Semaphore(與初始計數= 1)

回答

1

所有權意味着您不能在一個線程中鎖定互斥並在另一個線程中釋放互斥。所以信號量更普遍。你可以用一個信號量來完成愚蠢的互斥量,但是你不能用一個互斥量來做信號量。

優先級反轉是以下情況:

1)高優先級線程,一種互斥

2)低優先級線程B保持該值,但不能執行,直到它釋放等待它引起

3)中間優先級的線程C-佔據CPU

爲了處理這種情況的調度應該有一定的邏輯:

到開始A更早地允許B執行而不是C

要理解B是誰停止A它必須知道互斥量的所有者。 對於信號燈來說,誰不能解鎖它:B或C.因此沒有辦法執行這種類型的邏輯。

+0

是的你是對的。爲了使優先級繼承正常工作,線程B將暫時繼承優先級更高的線程A的優先級。本質上,只是一個「條件變量」,比如'semaphore'並不總是足夠的。雖然'互斥量'可以用信號量來模擬,但只能用於有限的場景。對於E.g:'遞歸互斥'和'監聽'更加複雜,僅僅通過'semaphore'來實現。我還發現這個鏈接非常有用:http://en.wikipedia.org/wiki/Condition_variable#Condition_variables – aknon

0

互斥用Java(一些具體原因都以內部鎖和java.util.concurrent.Lock的形式)與事件通知機制很好地結合在一起。通過Semaphores實現這樣一個完整的互斥體是有問題的:它需要釋放一個信號量並獲取另一個作爲原子事務。

+0

那麼,不知道你在說什麼..我的意思是'事件通知機制'。但無論如何,這些問題是一個普遍問題,與特定的編程語言無關。你看我在說什麼, - 你是否在面向對象編程方面附加了「互斥量」和「信號量」的含義和差異? – aknon