自旋鎖與相互排斥鎖之抉擇

2021-09-08 22:04:49 字數 1596 閱讀 3861

自旋鎖和相互排斥鎖是多執行緒程式設計中的兩個重要概念。他們都能用來鎖定一些共享資源,以阻止影響資料一致性的併發訪問。可是他們之間確實存在差別,那麼這些差別是什麼?

理論上,當乙個執行緒試圖獲取乙個被鎖定的相互排斥鎖時,該操作會失敗然後該執行緒會進入睡眠,這樣就能立即讓還有乙個執行緒執行。當持有相互排斥鎖的執行緒釋放該鎖之後,進入睡眠狀態的執行緒就會被喚醒。可是,當乙個執行緒試圖獲取乙個自旋鎖而沒有成功時,該執行緒會不斷地重試,直到終於成功為止;因此該執行緒不會將執行權交到其它執行緒手中(當然,一旦當前執行緒的時間片超時,作業系統會強行切換到還有乙個執行緒)。

相互排斥鎖的問題在於:讓執行緒睡眠和喚醒執行緒都是極為耗時的操作,完畢這些操作須要大量cpu指令,因此也就須要耗費不少時間。假設僅僅是鎖定相互排斥鎖非常短一段時間,那麼讓執行緒睡眠和喚醒執行緒所花的時間可能會超過執行緒實際上睡眠的時間,甚至有可能會超過執行緒在自旋鎖上輪詢鎖浪費的時間(假設使用自旋鎖)。還有一方面,在自旋鎖上進行輪詢會浪費cpu時間,假設自旋鎖被鎖定較長的時間,可能會浪費大量的cpu時間,這時讓執行緒睡眠可能是乙個更好的選擇。

在乙個單核系統中使用自旋鎖是行不通的,由於只要自旋鎖輪詢在堵塞當前cpu,那麼就沒有其它執行緒可以執行,既然沒有其它執行緒可以執行,那麼該鎖也就不會被喚醒,對,我們進入死鎖了。最好情況下,自旋鎖只浪費那些對系統沒有不論什麼用處的cpu時間。相反,假設使用相互排斥鎖,執行緒a進入睡眠,那麼另外乙個執行緒b就行馬上執行,執行緒b有可能會釋放鎖,喚醒執行緒a,使執行緒a繼續執行。

在乙個多核系統,假設大量的鎖僅僅持有非常短一段時間,那麼讓執行緒睡眠和喚醒執行緒所浪費的時間有可能會極大地減少執行時效能。相反,假設使用自旋鎖,執行緒就有機會利用全然時間片(總是堵塞非常短一段時間,然後馬上執行),獲得更高的吞吐量。

由於大部分情況下,程式猿不能預先知道使用相互排斥鎖好還是使用自旋鎖好(比如:由於不知道目標系統的cpu核心數量),同一時候作業系統也不知道某個片段的**是否已經為單核或多核環境優化過,因此大部分系統不嚴格區分這兩種鎖。實際上,大部分現代作業系統都提供混合相互排斥鎖和混合自旋鎖。那麼,什麼是混合相互排斥鎖和混合自旋鎖?

在乙個多核系統,混合相互排斥鎖開始時會表現得像自旋鎖。即假設乙個執行緒a不能獲取到相互排斥鎖,那麼執行緒a不會立即進入睡眠狀態,由於該鎖可能立即就被釋放了,因此該相互排斥鎖開始表現得像自旋鎖。僅僅有當一段固定的時間後,執行緒a還不能獲取到該相互排斥鎖,執行緒a才會進入睡眠狀態。假設同樣的程式執行在單核系統下,該相互排斥鎖就不會表現出自旋鎖的行為。

乙個混合自旋鎖開始時會表現得像乙個普通的自旋鎖,但為了避免浪費cpu時間,它提供了乙個back-off策略。通常,混合自旋鎖不會使執行緒進入睡眠狀態(由於當你使用自旋鎖時,你不希望發生這樣的情況),可是它能停止某個執行緒(馬上或者一段固定的時間後),然後讓還有乙個執行緒執行,以提高自旋鎖的閒置率(乙個純粹的執行緒切換通常比使執行緒進入睡眠然後喚醒它效率更高,起碼眼下如此)。

假設你不知道該使用哪乙個,那麼使用相互排斥鎖,由於大部分現代作業系統都同意他們先自旋一小段時間(提前是該自旋故意), 所以相互排斥鎖一般是更好的選擇。有時,使用自旋鎖會提公升效能,在某些特定情況下,你可能會認為使用自旋鎖更好。這時候,使用你自己的鎖物件,該鎖物件內部使用自旋鎖或者相互排斥鎖實現(這個行為能夠通過配置改動),開始時所有使用相互排斥鎖,之後,假設你認為某個地方使用自旋鎖更好,那麼改動它,然後比較下結果,可是在下結論之前,一定要記得在單核和多核環境下進行測試。

執行緒同步與相互排斥 相互排斥鎖

在多工作業系統中,同一時候執行的多個任務可能都須要使用同一種資源。這個過程有點類似於,公司部門裡。我在使用著印表機列印東西的同一時候 還沒有列印完 別人剛好也在此刻使用印表機列印東西,假設不做不論什麼處理的話,列印出來的東西肯定是錯亂的。以下我們用程式模擬一下這個過程。執行緒一須要列印 hello ...

讀寫鎖與自旋鎖

一 讀寫鎖 1 特點 讀寫鎖比mutex有更高的適用性,可以多個執行緒同時占用讀模式的讀寫鎖,但是只能乙個執行緒占用寫模式的讀寫鎖。1 當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞 2 當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權...

互斥鎖與自旋鎖

一 互斥鎖 當鎖時可用的,呼叫上鎖的api會成功,並且將鎖設定為不再可用。當乙個程序嘗試獲取不可用的鎖的時候它會阻塞,直到鎖被釋放。進入臨界區時獲得鎖,退出臨界區時釋放鎖。二 自旋鎖 是指當乙個執行緒在獲取鎖的時候,如果鎖已經被其它執行緒獲取,那麼該執行緒將迴圈等待,然後不斷的判斷鎖是否能夠被成功獲...