1. 程式人生 > >自旋鎖(spin lock)與互斥量(mutex)的比較

自旋鎖(spin lock)與互斥量(mutex)的比較

from:http://blog.csdn.net/swordmanwk/article/details/6819457

自旋鎖是一種非阻塞鎖,也就是說,如果某執行緒需要獲取自旋鎖,但該鎖已經被其他執行緒佔用時,該執行緒不會被掛起,而是在不斷的消耗CPU的時間,不停的試圖獲取自旋鎖。

互斥量是阻塞鎖,當某執行緒無法獲取互斥量時,該執行緒會被直接掛起,該執行緒不再消耗CPU時間,當其他執行緒釋放互斥量後,作業系統會啟用那個被掛起的執行緒,讓其投入執行。

兩種鎖適用於不同場景:

如果是多核處理器,如果預計執行緒等待鎖的時間很短,短到比執行緒兩次上下文切換時間要少的情況下,使用自旋鎖是划算的。

如果是多核處理器,如果預計執行緒等待鎖的時間較長,至少比兩次執行緒上下文切換的時間要長,建議使用互斥量。

如果是單核處理器,一般建議不要使用自旋鎖。因為,在同一時間只有一個執行緒是處在執行狀態,那如果執行執行緒發現無法獲取鎖,只能等待解鎖,但因為自身不掛起,所以那個獲取到鎖的執行緒沒有辦法進入執行狀態,只能等到執行執行緒把作業系統分給它的時間片用完,才能有機會被排程。這種情況下使用自旋鎖的代價很高。

如果加鎖的程式碼經常被呼叫,但競爭情況很少發生時,應該優先考慮使用自旋鎖,自旋鎖的開銷比較小,互斥量的開銷較大。

參考文獻

《多核程式設計技術》

《linux核心設計與實現》