互斥鎖 讀寫鎖和自旋鎖的區別

2021-09-10 22:18:22 字數 1162 閱讀 9380

讀寫鎖特點:

讀寫鎖有三種狀態:讀加鎖狀態、寫加鎖狀態和不加鎖狀態 

只有乙個執行緒可以占有寫狀態的鎖,但可以有多個執行緒同時占有讀狀態鎖,這也是它可以實現高併發的原因。當其處於寫狀態鎖下,任何想要嘗試獲得鎖的執行緒都會被阻塞,直到寫狀態鎖被釋放;如果是處於讀狀態鎖下,允許其它執行緒獲得它的讀狀態鎖,但是不允許獲得它的寫狀態鎖,直到所有執行緒的讀狀態鎖被釋放;為了避免想要嘗試寫操作的執行緒一直得不到寫狀態鎖,當處於讀模式的讀寫鎖接收到乙個試圖對其進行寫模式加鎖操作時,便會阻塞後面對其進行讀模式加鎖操作的執行緒。 即當讀寫鎖感知到有執行緒想要獲得寫狀態鎖時,便會阻塞其後所有想要獲得讀狀態鎖的執行緒。這樣當讀模式的鎖解鎖後,要獲得寫狀態鎖的執行緒能夠訪問此鎖保護的資源。所以讀寫鎖非常適合資源的讀操作遠多於寫操作的情況。

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

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

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

互斥鎖特點:

在訪問共享資源之前對進行加鎖操作,在訪問完成之後進行解鎖操作。 加鎖後,任何其他試圖再次加鎖的執行緒會被阻塞,直到當前執行緒解鎖。 如果解鎖時有乙個以上的執行緒阻塞,那麼所有該鎖上的執行緒都被程式設計就緒狀態, 第乙個變為就緒狀態的執行緒又執行加鎖操作,那麼其他的執行緒又會進入等待。 在這種方式下,只有乙個執行緒能夠訪問被互斥鎖保護的資源。

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

自旋鎖特點:

從 實現原理上來講,互斥鎖屬於sleep-waiting(睡眠等待)型別的鎖。例如在乙個雙核的機器上有兩個執行緒(執行緒a和執行緒b),它們分別執行在core0和 core1上。假設執行緒a想要通過pthread_mutex_lock操作去得到乙個臨界區的鎖,而此時這個鎖正被執行緒b所持有,那麼執行緒a就會被阻塞 (blocking),core0 會在此時進行上下文切換(context switch)將執行緒a置於等待佇列中,此時core0就可以執行其他的任務(例如另乙個執行緒c)而不必進行忙等待。而自旋鎖則不然,它屬於busy-waiting(忙等待)型別的鎖,如果執行緒a是使用pthread_spin_lock操作去請求鎖,那麼執行緒a就會一直在 core0上進行忙等待並不停的進行鎖請求,直到得到這個鎖為止。

互斥鎖 遞迴鎖 讀寫鎖和自旋鎖區別

共享資源的使用是互斥的,即乙個執行緒獲得資源的使用權後就會將改資源加鎖,使用完後會將其解鎖,所以在使用過程中有其它執行緒想要獲取該資源的鎖,那麼它就會被阻塞陷入睡眠狀態,直到該資源被解鎖才會別喚醒,如果被阻塞的資源不止乙個,那麼它們都會被喚醒,但是獲得資源使用權的是第乙個被喚醒的執行緒,其它執行緒又...

互斥鎖和自旋鎖的區別

自旋鎖 spin lock 自旋鎖與互斥鎖有點類似,只是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是 否該自旋鎖的保持者已經釋放了鎖,自旋 一詞就是因此而得名。其作用是為了解決某項資源的互斥使用。因為自旋鎖不會引起呼叫者睡眠,所以自旋鎖的效率遠 高於互斥鎖。...

自旋鎖和互斥鎖的區別

自旋鎖是一種互斥鎖的實現方式而已,相比一般的互斥鎖會在等待期間放棄cpu,自旋鎖 spinlock 則是不斷迴圈並測試鎖的狀態,這樣就一直佔著cpu。互斥鎖 用於保護臨界區,確保同一時間只有乙個執行緒訪問資料。對共享資源的訪問,先對互斥量進行加鎖,如果互斥量已經上鎖,呼叫執行緒會阻塞,直到互斥量被解...