讀寫鎖
多個讀者可以同時進行讀
寫者必須互斥(只允許一個寫者寫,也不能讀者寫者同時進行)
寫者優先於讀者(一旦有寫者,則后續讀者必須等待,喚醒時優先考慮寫者)
互斥鎖
一次只能一個線程擁有互斥鎖,其他線程只有等待
互斥鎖是在搶鎖失敗的情況下主動放棄CPU進入睡眠狀態直到鎖的狀態改變時再喚醒,而操作系統負責 線程調度,為了實現鎖的狀態發生改變時喚醒阻塞的線程或者進程,需要把鎖交給操作系統管理,所以 互斥鎖在加鎖操作時涉及上下文的切換。互斥鎖實際的效率還是可以讓人接受的,加鎖的時間大概 100ns左右,而實際上互斥鎖的一種可能的實現是先自旋一段時間,當自旋的時間超過閥值之后再將線 程投入睡眠中,因此在並發運算中使用互斥鎖(每次占用鎖的時間很短)的效果可能不亞於使用自旋鎖
條件變量
互斥鎖一個明顯的缺點是他只有兩種狀態:鎖定和非鎖定。而條件變量通過允許線程阻塞和等待另一個 線程發送信號的方法彌補了互斥鎖的不足,他常和互斥鎖一起使用,以免出現競態條件。當條件不滿足 時,線程往往解開相應的互斥鎖並阻塞線程然后等待條件發生變化。一旦其他的某個線程改變了條件變 量,他將通知相應的條件變量喚醒一個或多個正被此條件變量阻塞的線程。總的來說互斥鎖是線程間互 斥的機制,條件變量則是同步機制。
自旋鎖
如果進線程無法取得鎖,進線程不會立刻放棄CPU時間片,而是一直循環嘗試獲取鎖,直到獲取為止。 如果別的線程長時期占有鎖,那么自旋就是在浪費CPU做無用功,但是自旋鎖一般應用於加鎖時間很短 的場景,這個時候效率比較高。