互斥鎖 讀寫鎖 自旋鎖 條件變數的特點總結

2021-08-19 15:16:23 字數 1552 閱讀 7144

讀寫鎖特點:

1

)多個讀者可以同時進行讀

2

)寫者必須互斥(只允許乙個寫者寫,也不能讀者寫者同時進行)

3

)寫者優先於讀者(一旦有寫者,則後續讀者必須等待,喚醒時優先考慮寫者)

互斥鎖特點:

一次只能乙個執行緒擁有互斥鎖,其他執行緒只有等待

互斥鎖是在搶鎖失敗的情況下主動放棄cpu進入睡眠狀態直到鎖的狀態改變時再喚醒,而作業系統負責執行緒排程,為了實現鎖的狀態發生改變時喚醒阻塞的執行緒或者程序,需要把鎖交給作業系統管理,所以互斥鎖在加鎖操作時涉及上下文的切換。互斥鎖實際的效率還是可以讓人接受的,加鎖的時間大概100ns左右,而實際上互斥鎖的一種可能的實現是先自旋一段時間,當自旋的時間超過閥值之後再將執行緒投入睡眠中,因此在併發運算中使用互斥鎖(每次占用鎖的時間很短)的效果可能不亞於使用自旋鎖。

條件變數的特點:

互斥鎖乙個明顯的缺點是他只有兩種狀態:鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補了互斥鎖的不足,他常和互斥鎖一起使用,以免出現競態條件。當條件不滿足時,執行緒往往解開相應的互斥鎖並阻塞執行緒然後等待條件發生變化。一旦其他的某個執行緒改變了條件變數,他將通知相應的條件變數喚醒乙個或多個正被此條件變數阻塞的執行緒。總的來說互斥鎖是執行緒間互斥的機制,條件變數則是同步機制。

自旋鎖的特點:

如果進執行緒無法取得鎖,進執行緒不會立刻放棄cpu

時間片,而是一直迴圈嘗試獲取鎖,直到獲取為止。如果別的執行緒長時期占有鎖那麼自旋就是在浪費cpu做無用功,但是自旋鎖一般應用於加鎖時間很短的場景,這個時候效率比較高。

互斥鎖

pthread_mutex_init()

pthread_mutex_lock()

pthread_mutex_unlock()

讀寫鎖pthread_rwlock_init()

pthread_rwlock_rdlock()

pthread_rwlock_wrlock()

pthread_rwlock_unlock()

條件變數

pthread_cond_init()

pthread_cond_wait()

pthread_cond_signal()

互斥鎖 自旋鎖 讀寫鎖 條件變數

互斥鎖 同一時刻只能有乙個執行緒進入臨界區,乙個執行緒獲取鎖如果失敗,則該執行緒進入睡眠狀態,同一執行緒多次加鎖會造成死鎖。使用場景 1.持鎖時間長 2臨界區競爭非常激烈 3 單核處理器 自旋鎖 不會造成執行緒進入睡眠狀態,執行緒會不斷檢測鎖是否已經釋放,減少了執行緒從睡眠到喚醒的核心開銷。使用場景...

互斥鎖 讀寫鎖 自旋鎖 條件變數的特點總結

讀寫鎖特點 1 多個讀者可以同時進行讀 2 寫者必須互斥 只允許乙個寫者寫,也不能讀者寫者同時進行 3 寫者優先於讀者 一旦有寫者,則後續讀者必須等待,喚醒時優先考慮寫者 互斥鎖特點 一次只能乙個執行緒擁有互斥鎖,其他執行緒只有等待 互斥鎖是在搶鎖失敗的情況下主動放棄cpu進入睡眠狀態直到鎖的狀態改...

Linux 互斥鎖 遞迴鎖 自旋鎖 讀寫鎖

在多執行緒中,我們經常會要用到鎖,那麼,鎖是什麼,我們為什麼要用到鎖?回到問題的本質,我們在什麼場景下會用到鎖?鎖是針對程式中的臨界資源,也就是公共資源的,當我們有兩個或多個執行緒同時對乙個臨界資源操作的時候,為了保證共享資料操作的完整性,我們要為這些公共資源加鎖。在linux中常見的鎖主要有互斥鎖...