您現在的位置是:首頁 > 動作武俠首頁動作武俠

如何理解自旋鎖?

簡介是的,就鎖的使用上,自旋鎖的使用方式和互斥鎖的使用並無太大區別,但需要注意的是,自旋鎖等待的過程是100%一個核的CPU的,也即是不會讓出CPU,這一點和其他鎖不同

神龍擺尾鎖怎麼解

作者| 慕課網精英講師 咚咚嗆

最近總有同學問我:

對自旋鎖的介紹完全聽不懂。我猜,這是一種執行緒的鎖定,直到這個執行緒不用這個資源了,才會徹底解鎖,讓出執行緒。但是希望得到嚴謹的解答,謝謝。

這個問題要從自旋鎖的實現去回答。自旋鎖是用於多執行緒同步的一種鎖,執行緒反覆檢查鎖變數是否可用。由於執行緒在這一過程中保持執行,因此是一種忙等待,也即是名字中“自旋”本身的含義。

自旋鎖在不同語言都有不同的實現,但核心邏輯都是一樣的,你可以看做是一個死迴圈去判斷鎖變數是否可用,如果可用則跳出迴圈,否則繼續死迴圈。

邏輯如下:

void

spin_lock

lock

{

while

test

_and_

set

(lock,

true

));// 鎖可用則返回,否則繼續迴圈

}

生產者每次加一前後都會加鎖和解鎖,那解鎖後,鎖變數可用,消費者執行緒就有機會進行減一操作了。那不就是和互斥鎖一樣了嗎?

如何理解自旋鎖?

是的,就鎖的使用上,自旋鎖的使用方式和互斥鎖的使用並無太大區別,但需要注意的是,自旋鎖等待的過程是100%一個核的CPU的,也即是不會讓出CPU,這一點和其他鎖不同。這一點在課程中,有詳細的演示。

既然這種鎖會100%佔用CPU,那為什麼計算機需要有自旋鎖這種鎖,對計算機的效能有什麼好處呢?

這是好問題,為什麼計算機內部的實現需要自旋鎖,這需要聯絡前面學習的知識。

透過前面的學習我們知道,程序或者執行緒在執行的時候,是有上下文的,當不同執行緒進行切換的時候,為了讓執行緒可以執行起來,需要很多的準備工作,這個準備工作,我們稱為“上下文切換”。

在CPU的一個核中,每秒鐘可會進行萬級~十萬級別的上下文切換次數,每次上下文切換都需要一定的成本,因此頻繁的上下文切換會對計算機效能造成較大的影響。

鎖的好處就是它只是忙等待,執行緒始終在執行,相比互斥鎖的使用,避免了上下文切換。

所以這也限定了互斥鎖的使用範圍,如果互斥鎖等待的時間過長,那麼由於它本身對CPU的佔用,會導致別的執行緒無法使用CPU。

因此,互斥鎖適用於可預見等待時間很短的多執行緒同步場景,而對於等待時間不可預測或者等待時間很長的場景,仍然是互斥鎖具備更高的效率。

Top