自旋鎖是為實現保護共享資源而提出一種輕量級的鎖機制。自旋鎖屬於互斥鎖的一種,都是為了解決某項資源的互斥使用。
理解:執行緒a正在占用cpu使用時,執行緒b也想要占用cpu,但此時a已經加了使用標誌(鎖),那麼b就可以有不同的操作無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有乙個擁有者,也就說,在任何時刻最多只能有乙個執行緒獲得鎖。但是兩者在排程機制上有很大的不同。對於互斥鎖,如果互斥鎖已經被占有,申請者只能進入睡眠狀態。但是自旋鎖不會引起申請者睡眠,如果自旋鎖已經被別的執行緒占有,申請者就一直在那裡迴圈判斷該自旋鎖的擁有者是否已經釋放了該鎖, 「自旋」一詞就是因此而得名。
互斥鎖:用於保護臨界區,確保同一時間只有乙個執行緒訪問資料。對共享資源的訪問,先對互斥量進行加鎖,如果互斥量已經上鎖,呼叫執行緒會阻塞,直到互斥量被解鎖。在完成了對共享資源的訪問後,要對互斥量進行解鎖。自旋鎖:與互斥量類似,它不是通過休眠使程序阻塞,而是在獲取鎖之前一直處於忙等(自旋)阻塞狀態。用在以下情況:鎖持有的時間短,而且執行緒並不希望在重新排程上花太多的成本。"原地打轉"。
區別:執行緒在申請自旋鎖的時候,執行緒不會被掛起,而是處於忙等的狀態。自旋鎖不會引起呼叫者睡眠,因此其效率遠高於互斥鎖,但自旋鎖一直占用著cpu,如果不能在短時間內獲得鎖就會使cpu的效率降低,且容易造成死鎖。自旋鎖適用於鎖使用者保持鎖時間比較短的情況。訊號量適用於保持鎖時間較長的情況。
自旋鎖和互斥鎖
1.理論分析 從理論上說,如果乙個執行緒嘗試加鎖乙個互斥鎖的時候沒有成功,因為互斥鎖已經被鎖住了,這個未獲取鎖的執行緒會休眠以使得其它執行緒可以馬上執行。這個執行緒會一直休眠,直到持有鎖的執行緒釋放了互斥鎖,休眠的執行緒才會被喚醒。如果乙個執行緒嘗試獲得乙個自旋鎖的時候沒有成功,該執行緒會一直嘗試加...
互斥鎖與自旋鎖
一 互斥鎖 當鎖時可用的,呼叫上鎖的api會成功,並且將鎖設定為不再可用。當乙個程序嘗試獲取不可用的鎖的時候它會阻塞,直到鎖被釋放。進入臨界區時獲得鎖,退出臨界區時釋放鎖。二 自旋鎖 是指當乙個執行緒在獲取鎖的時候,如果鎖已經被其它執行緒獲取,那麼該執行緒將迴圈等待,然後不斷的判斷鎖是否能夠被成功獲...
自旋鎖與互斥鎖
互斥鎖,就是悲觀鎖,保證乙個執行緒進去。執行緒會從sleep 加鎖 runng 解鎖 過程中有上下文的切換,cpu的搶占,訊號的傳送等開銷。自旋鎖 執行緒一直都是running 加鎖 解鎖 死迴圈檢測鎖位的標誌位,機制不複雜。自旋鎖 由於自旋鎖使用者一般保持鎖時間非常短,因此選擇自旋鎖而不是睡眠是非...