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

2021-07-16 05:08:21 字數 1697 閱讀 5782

互斥鎖:同一時刻只能有乙個執行緒進入臨界區,乙個執行緒獲取鎖如果失敗,則該執行緒進入睡眠狀態,同一執行緒多次加鎖會造成死鎖。

使用場景:

1.持鎖時間長

2臨界區競爭非常激烈

3 單核處理器

自旋鎖:不會造成執行緒進入睡眠狀態,執行緒會不斷檢測鎖是否已經釋放,減少了執行緒從睡眠到喚醒的核心開銷。

使用場景:

1.鎖使用者持鎖時間短

2多核處理器

互斥鎖原始開銷比自旋鎖大,但自旋鎖會一直搶占cpu,持鎖時間長,加鎖開銷越大。

讀寫鎖:顧名思義對讀和寫區分的鎖,允許多個執行緒同時讀,而寫操作只能乙個執行緒進行寫,寫模式鎖優先於讀模式鎖。

讀寫鎖適用於讀多寫少的場景。

執行緒同步:何時互斥鎖不夠,還需要條件變數?

假設有共享的資源sum,與之相關聯的mutex 是lock_s.假設每個執行緒對sum的操作很簡單的,與sum的狀態無關,比如只是sum++.那麼只用mutex足夠了.程式設計師只要確保每個執行緒操作前,取得lock,然後sum++,再unlock即可.每個執行緒的**將像這樣

add()

如果操作比較複雜,假設執行緒t0,t1,t2的操作是sum++,而執行緒t3則是在sum到達100的時候,列印出一條資訊,並對sum清零. 這種情況下,如果只用mutex, 則t3需要乙個迴圈,每個迴圈裡先取得lock_s,然後檢查sum的狀態,如果sum>=100,則列印並清零,然後unlock.如果sum& amp; lt;100,則unlock,並sleep()本執行緒合適的一段時間.

這個時候,t0,t1,t2的**不變,t3的**如下

print()

else }

}這種辦法有兩個問題

1) sum在大多數情況下不會到達100,那麼對t3的**來說,大多數情況下,走的是else分支,只是lock和unlock,然後sleep().這浪費了cpu處理時間.

2) 為了節省cpu處理時間,t3會在探測到sum沒到達100的時候sleep()一段時間.這樣卻又帶來另外乙個問題,亦即t3響應速度下降.可能在sum到達200的時候,t4才會醒過來.

3) 這樣,程式設計師在設定sleep()時間的時候陷入兩難境地,設定得太短了節省不了資源,太長了又降低響應速度.真是難辦啊!

這個時候,condition variable**外穿,從天而降,拯救了焦頭爛額的你.

你首先定義乙個condition variable.

pthread_cond_t cond_sum_ready=pthread_cond_initializer;

t0,t1,t2的**只要後面加兩行,像這樣

add()

而t3的**則是

print

注意兩點:

1) 在thread_cond_wait()之前,必須先lock相關聯的mutex, 因為假如目標條件未滿足,pthread_cond_wait()實際上會unlock該mutex, 然後block,在目標條件滿足後再重新lock該mutex, 然後返回.

2) 為什麼是while(sum<100),而不是if(sum<100) ?這是因為在pthread_cond_signal()和pthread_cond_wait()返回之間,有時間差,假設在這個時間差內,還有另外乙個執行緒t4又把sum減少到100以下了,那麼t3在pthread_cond_wait()返回之後,顯然應該再檢查一遍sum的大小.這就是用 while的用意

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

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

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

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

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

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