一:互斥鎖:當鎖時可用的,呼叫上鎖的api會成功,並且將鎖設定為不再可用。當乙個程序嘗試獲取不可用的鎖的時候它會阻塞,直到鎖被釋放。
進入臨界區時獲得鎖,退出臨界區時釋放鎖。
二:自旋鎖:是指當乙個執行緒在獲取鎖的時候,如果鎖已經被其它執行緒獲取,那麼該執行緒將迴圈等待,然後不斷的判斷鎖是否能夠被成功獲取,直到獲取到鎖才會退出迴圈。
與互斥鎖類似,都是為了保護共享資源。互斥鎖是當資源被占用,申請者進入睡眠狀態;而自旋鎖則迴圈檢測保持者是否已經釋放鎖。
自旋鎖比較適用於鎖使用者保持鎖時間比較短(等待時間小於兩次上下文切換)的情況。正是由於自旋鎖使用者一般保持鎖時間非常短,因此選擇自旋而不是睡眠是非常必要的,自旋鎖的效率遠高於互斥鎖。
自旋鎖在單處理器與多處理器系統中的實現是不同的。
對於單處理器而言,需要考慮是否關閉核心搶占功能
如果關閉搶占功能,此時執行緒在核心模式下執行就不會被打斷,此時相當於順序執行鎖的意義不大,在編譯時會被刪除
如果啟用核心搶占,即別的核心執行緒可以打斷當前執行執行緒,別的搶占執行結束之後才會執行之前的,所以鎖任然沒有意義,在編譯時會被刪除
在多處理器的情況下,核心中處理執行緒考慮執行緒安全時,自旋鎖的存在是有意義的,所以會編譯進入。
自旋鎖的優點:
1.自旋鎖不會使執行緒狀態發生切換,一直處於使用者態,即執行緒一直都是active的;不會使執行緒進入阻塞狀態,減少了不必要的上下文切換,執行速度快
2.非自旋鎖在獲取不到鎖的時候會進入阻塞狀態,從而進入核心態,當獲取到鎖的時候需要從核心態恢復,需要執行緒上下文切換。 (執行緒被阻塞後便進入核心(linux)排程狀態,這個會導致系統在使用者態與核心態之間來回切換,嚴重影響鎖的效能)
自旋鎖與互斥鎖
互斥鎖,就是悲觀鎖,保證乙個執行緒進去。執行緒會從sleep 加鎖 runng 解鎖 過程中有上下文的切換,cpu的搶占,訊號的傳送等開銷。自旋鎖 執行緒一直都是running 加鎖 解鎖 死迴圈檢測鎖位的標誌位,機制不複雜。自旋鎖 由於自旋鎖使用者一般保持鎖時間非常短,因此選擇自旋鎖而不是睡眠是非...
自旋鎖和互斥鎖
1.理論分析 從理論上說,如果乙個執行緒嘗試加鎖乙個互斥鎖的時候沒有成功,因為互斥鎖已經被鎖住了,這個未獲取鎖的執行緒會休眠以使得其它執行緒可以馬上執行。這個執行緒會一直休眠,直到持有鎖的執行緒釋放了互斥鎖,休眠的執行緒才會被喚醒。如果乙個執行緒嘗試獲得乙個自旋鎖的時候沒有成功,該執行緒會一直嘗試加...
自旋鎖和互斥鎖
自旋鎖是為實現保護共享資源而提出一種輕量級的鎖機制。自旋鎖屬於互斥鎖的一種,都是為了解決某項資源的互斥使用。理解 執行緒a正在占用cpu使用時,執行緒b也想要占用cpu,但此時a已經加了使用標誌 鎖 那麼b就可以有不同的操作 無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有乙個擁有者,也就說,在任何...