互斥鎖和自旋鎖的區別

2021-08-10 06:44:48 字數 1333 閱讀 1817

自旋鎖(spin lock)

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

1、自旋鎖一直占用cpu,他在未獲得鎖的情況下,一直執行--自旋,所以占用著cpu,如果不能在很短的時 間內獲得鎖,這無疑會使cpu效率降低。

2、在用自旋鎖時有可能造成死鎖,當遞迴呼叫時有可能造成死鎖,呼叫有些其他函式也可能造成死鎖,如 copy_to_user()、copy_from_user()、kmalloc()等。

因此我們要慎重使用自旋鎖,自旋鎖只有在核心可搶占式或smp的情況下才真正需要,在單cpu且不可搶占式的核心下,自旋鎖的操作為空操作。自旋鎖適用於鎖使用者保持鎖時間比較短的情況下。

兩種鎖的加鎖原理

互斥鎖:執行緒會從sleep(加鎖)——>running(解鎖),過程中有上下文的切換,cpu的搶占,訊號的傳送等開銷。

自旋鎖:執行緒一直是running(加鎖——>解鎖),死迴圈檢測鎖的標誌位,機制不複雜。

互斥鎖屬於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上進行忙等待並不停的進行鎖請求,直到得到這個鎖為止。

兩種鎖的區別

互斥鎖的起始原始開銷要高於自旋鎖,但是基本是一勞永逸,臨界區持鎖時間的大小並不會對互斥鎖的開銷造成影響,而自旋鎖是死迴圈檢測,加鎖全程消耗cpu,起始開銷雖然低於互斥鎖,但是隨著持鎖時間,加鎖的開銷是線性增長。

兩種鎖的應用

互斥鎖用於臨界區持鎖時間比較長的操作,比如下面這些情況都可以考慮

1 臨界區有io操作

2 臨界區**複雜或者迴圈量大

3 臨界區競爭非常激烈

4 單核處理器

至於自旋鎖就主要用在臨界區持鎖時間非常短且cpu資源不緊張的情況下,自旋鎖一般用於多核的伺服器。

自旋鎖和互斥鎖的區別

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

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

讀寫鎖特點 讀寫鎖有三種狀態 讀加鎖狀態 寫加鎖狀態和不加鎖狀態 只有乙個執行緒可以占有寫狀態的鎖,但可以有多個執行緒同時占有讀狀態鎖,這也是它可以實現高併發的原因。當其處於寫狀態鎖下,任何想要嘗試獲得鎖的執行緒都會被阻塞,直到寫狀態鎖被釋放 如果是處於讀狀態鎖下,允許其它執行緒獲得它的讀狀態鎖,但...

自旋鎖和互斥鎖

1.理論分析 從理論上說,如果乙個執行緒嘗試加鎖乙個互斥鎖的時候沒有成功,因為互斥鎖已經被鎖住了,這個未獲取鎖的執行緒會休眠以使得其它執行緒可以馬上執行。這個執行緒會一直休眠,直到持有鎖的執行緒釋放了互斥鎖,休眠的執行緒才會被喚醒。如果乙個執行緒嘗試獲得乙個自旋鎖的時候沒有成功,該執行緒會一直嘗試加...