1, spinlock介紹
spinlock又稱自旋鎖,線程通過busy-wait-loop的方式來獲取鎖,任時刻只有一個線程能夠獲得鎖,其他線程忙等待直到獲得鎖。spinlock在多處理器多線程環境的場景中有很廣泛的使用,一般要求使用spinlock的臨界區儘量簡短,這樣獲取的鎖可以儘快釋放,以滿足其他忙等的線程。Spinlock和mutex不同,spinlock不會導致線程的狀態切換(用戶態->內核態),但是spinlock使用不當(如臨界區執行時間過長)會導致cpu busy飆高。
2, spinlock與mutex對比
2.1,優缺點比較
spinlock不會使線程狀態發生切換,mutex在獲取不到鎖的時候會選擇sleep。
mutex獲取鎖分爲兩階段,第一階段在用戶態採用spinlock鎖總線的方式獲取一次鎖,如果成功立即返回;否則進入第二階段,調用系統的futex鎖去sleep,當鎖可用後被喚醒,繼續競爭鎖。
Spinlock優點:沒有昂貴的系統調用,一直處於用戶態,執行速度快。
Spinlock缺點:一直佔用cpu,而且在執行過程中還會鎖bus總線,鎖總線時其他處理器不能使用總線。
Mutex優點:不會忙等,得不到鎖會sleep。
Mutex缺點:sleep時會陷入到內核態,需要昂貴的系統調用。
2.2,使用準則
Spinlock使用準則:臨界區儘量簡短,控制在100行代碼以內,不要有顯式或者隱式的系統調用,調用的函數也儘量簡短。例如,不要在臨界區中調用read,write,open等會產生系統調用的函數,也不要去sleep;strcpy,memcpy等函數慎用,依賴於數據的大小。