http://blog.csdn.net/dong976209075/article/details/8004325
理論上:
mutex和spinlock都是用于多進程/線程間訪問公共資源時保持同步用的,只是在lock失敗的時候處理方式有所不同。首先,當一個thread 給一個mutex上鎖失敗的時候,thread會進入sleep狀態,從而讓其他的thread運行,其中就包裹已經給mutex上鎖成功的那個thread,被占用的lock一旦釋放,就會去wake up 那個sleep的thread。其次,當一個thread給一個spinlock上鎖失敗的時候,thread會在spinlock上不停的輪訊,直到成功,所以他不會進入sleep狀態(當然,時間片用完了,內核會自動進行調度)。
存在的問題:
無論是mutex還是spinlock,如果一個thread去給一個已經被其他thread占用的鎖上鎖,那么從此刻起到其他thread對此鎖解鎖的時間長短將會導致mutex和spinlock出現下面的問題。
mutex的問題是,它一旦上鎖失敗就會進入sleep,讓其他thread運行,這就需要內核將thread切換到sleep狀態,如果mutex又在很短的時間內被釋放掉了,那么又需要將此thread再次喚醒,這需要消耗許多CPU指令和時間,這種消耗還不如讓thread去輪訊。也就是說,其他thread解鎖時間很短的話會導致CPU的資源浪費。
spinlock的問題是,和上面正好相反,如果其他thread解鎖的時間很長的話,這種spinlock進行輪訊的方式將會浪費很多CPU資源。
解決方法:
對于single-core/single-CPU,spinlock將一直浪費CPU資源,如果采用mutex,反而可以立刻讓其他的thread運行,可能去釋放mutex lock。對于multi-core/mutil-CPU,會存在很多短時間被占用的lock,如果總是去讓thread sleep,緊接著去wake up,這樣會浪費很多CPU資源,從而降低了系統性能,所以應該盡量使用spinlock。
現實情況:
由于程序員不太可能確定每個運行程序的系統CPU和core的個數,所以也不可能去確定使用那一種lock。因此現在的操作系統通常不太區分mutex和spinlock了。實際上,大多數現代操作系統已經使用了混合mutex(hybrid mutex)和混合spinlock(hybrid spinlock)。說白了就是將兩者的特點相結合。
hydrid mutex:在一個multi-core系統上,hybrid mutex首先像一個spinlock一樣,當thread加鎖失敗的時候不會立即被設置成sleep,但是,當過了一定的時間(或則其他的策略)還沒有獲得lock,就會被設置成sleep,之后再被wake up。而在一個single-core系統上,hybrid mutex就不會表現出spinlock的特性,而是如果加鎖失敗就直接被設置成sleep。
hybrid spinlock:和hybrid mutex相似,只不過,thread加鎖失敗后在spinlock一段很短的時間后,會被stop而不是被設置成sleep,stop是正常的進程調度,應該會比先讓thread sleep然后再wake up的開銷小一些。
總結:
寫程序的時候,如果對mutex和spinlock有任何疑惑,請選擇使用mutex。
原文參考:http://stackoverflow.com/questions/5869825/when-should-one-use-a-spinlock-instead-of-mutex