C:訊號量和互斥量
訊號量
訊號量(semaphore),重點在
訊號
,是一種訊號機制 —— “我已經把事情幹好了,下面該你了”。典型的生產者——消費者模型。是協調任務執行順序的一種機制。比如有兩個任務 A 和 B。任務 A 在執行兩個數的加法運算,任務 B 需要用任務 A 運算的結果去執行乘法運算。此時,在任務 A 沒有完成之前,任務 B 必須等待。當任務 A 完成後,使用訊號量通知任務 B 去取結果。
互斥量
互斥量(mutex),重點在
互斥
,是一種鎖機制——”現在這個東西歸我,等我用完你們才能用,現在你們都得等著“。比如有兩個任務 A 和 B,一個檔案描述符。A 和 B 都向檔案中寫入資料。如果同時寫入,那麼會導致檔案內容紊亂,此時就需要鎖機制。對檔案描述符加鎖。佔有鎖的任務可以執行寫入操作。如果另一個任務也想寫入資料,那麼它必須先獲得鎖。如果測試鎖被佔用,那麼它必須等待鎖可用後才能寫入資料。
不同點
所有者不同:
訊號量:一個任務可以只獲取(釋放)訊號量。獲取訊號量的任務不必非得釋放訊號量,反之亦然;
互斥量:佔有互斥量的任務負責釋放互斥量;
優先順序反轉問題:
雖然二值訊號量可以實現互斥量的功能(很多人這麼用),但是訊號量沒有實現防止優先順序反轉的功能。互斥量可以使用優先順序繼承和天花板策略防止優先順序反轉。
總結
要專項專用。訊號量用於“通知”,互斥量用於“鎖”。
參考
https://
stackoverflow。com/quest
ions/62814/difference-between-binary-semaphore-and-mutex#
Mutex vs。 Semaphores – Part 1: Semaphores
Mutex vs。 Semaphores – Part 2: The Mutex
Mutex vs。 Semaphores – Part 3: Mutual Exclusion Problems