1. 理論分析
從理論上說, 如果乙個執行緒嘗試加鎖乙個互斥鎖的時候沒有成功, 因為互斥鎖已經被鎖住了, 這個未獲取鎖的執行緒會休眠以使得其它執行緒可以馬上執行。 這個執行緒會一直休眠, 直到持有鎖的執行緒釋放了互斥鎖, 休眠的執行緒才會被喚醒。 如果乙個執行緒嘗試獲得乙個自旋鎖的時候沒有成功, 該執行緒會一直嘗試加鎖直到成功獲取鎖。 因此它不允許其它執行緒執行(當然, 作業系統會在該執行緒所在的時間片用完時, 強制切換到其它執行緒)
2. 存在的問題
互斥鎖存在的問題是, 執行緒的休眠和喚醒都是相當昂貴的操作, 它們需要大量的cpu指令, 因此需要花費一些時間。 如果互斥量僅僅被鎖住很短的一段時間, 用來使執行緒休眠和喚醒執行緒的時間會比該執行緒睡眠的時間還長, 甚至有可能比不斷在自旋鎖上輪訓的時間還長。自旋鎖的問題是, 如果自旋鎖被持有的時間過長, 其它嘗試獲取自旋鎖的執行緒會一直輪訓自旋鎖的狀態, 這將非常浪費cpu的執行時間, 這時候該執行緒睡眠會是乙個更好的選擇
3. 解決方案
在單核/單cpu系統上使用自旋鎖是沒用的, 因為當執行緒嘗試獲取自旋鎖不成功的時候會一直嘗試, 這會一直占用cpu, 其它執行緒不可能執行, 因為其他執行緒不能執行, 這個鎖也就不會被解鎖
自旋鎖和互斥鎖
自旋鎖是為實現保護共享資源而提出一種輕量級的鎖機制。自旋鎖屬於互斥鎖的一種,都是為了解決某項資源的互斥使用。理解 執行緒a正在占用cpu使用時,執行緒b也想要占用cpu,但此時a已經加了使用標誌 鎖 那麼b就可以有不同的操作 無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有乙個擁有者,也就說,在任何...
互斥鎖與自旋鎖
一 互斥鎖 當鎖時可用的,呼叫上鎖的api會成功,並且將鎖設定為不再可用。當乙個程序嘗試獲取不可用的鎖的時候它會阻塞,直到鎖被釋放。進入臨界區時獲得鎖,退出臨界區時釋放鎖。二 自旋鎖 是指當乙個執行緒在獲取鎖的時候,如果鎖已經被其它執行緒獲取,那麼該執行緒將迴圈等待,然後不斷的判斷鎖是否能夠被成功獲...
自旋鎖與互斥鎖
互斥鎖,就是悲觀鎖,保證乙個執行緒進去。執行緒會從sleep 加鎖 runng 解鎖 過程中有上下文的切換,cpu的搶占,訊號的傳送等開銷。自旋鎖 執行緒一直都是running 加鎖 解鎖 死迴圈檢測鎖位的標誌位,機制不複雜。自旋鎖 由於自旋鎖使用者一般保持鎖時間非常短,因此選擇自旋鎖而不是睡眠是非...