初步區分和理解semaphore(信號量), event(事件), lock/mutex(鎖), condition ...
semaphore: 標記是否存在可用資源
- 沒有所屬概念,使用較為隨意
- 在使用過程中,由於較為隨意,所以容易出現一些問題:
- 意外釋放: A和B都打算使用同一個信號量,但是在編寫B的過程中,忘記申請信號,直接釋放
- 遞歸死鎖: A申請了信號,A的子程式仍然要繼續申請
- 任務死亡導致死鎖: A申請到了信號,但是沒有釋放就掛了
- 優先順序反轉: A和C都需要信號量,此時C申請到了信號。但是A優先順序高於C,所以A搶占C,但因為需要信號,所以重新調用C,A阻塞。而此時B優先順序高於C,低於A,會搶占C
- 信號量更多用於同步(通知某一方可以執行)
lock/mutex(MUTual EXclusion): 標記某方是否可以申請相關資源
- 有所屬概念,誰擁有,誰釋放。相當於對semaphore添加了一些使用規則,相較於semaphore更安全
- 不同的系統實現不同,因此對於semaphore中出現的問題,解決的力度也不一樣
- 鎖更多用於保護資源,防止不一致
condition: 當滿足一定條件,則通知相關方可以申請lock/mutex
event: 標記某件事情的發生,所需方可以進一步操作。其可看做是信號量的進一步發展
參考資料
信號量 互斥鎖 條件變數的區別
臨界區,互斥量,信號量,事件的區別
Difference between binary semaphore and mutex
What is mutex and semaphore in Java ? What is the main difference?
Lock, mutex, semaphore… what's the difference?
Mutex vs. Semaphores – Part 1: Semaphores
Mutex vs. Semaphores – Part 2: The Mutex