2011-02-17 45 views
1

看起來,自旋鎖不是很好,因爲它們在等待(阻塞)時浪費CPU週期。 如果線程剛好在等待喚醒信號時進入休眠狀態,那麼在旋轉時CPU週期不會丟失。什麼時候使用螺旋鎖是一個好主意?

如果鎖持有非常短的時間,也許使用自旋鎖很好,那麼它可能使用更少的時間?如果這是真的,爲什麼?

+0

你可能想看看關於這一主題的維基百科條目(http://en.wikipedia.org/wiki/Spinlock)。它似乎非常豐富。 :) – gbvb 2011-02-17 04:02:12

回答

3

是的,這是正確的。

因爲上下文切換很貴。操作系統和CPU必須執行(相對)大量的工作來執行上下文切換。紡紗幾個週期反而會便宜很多,即使這些週期在理論上浪費了。

1

自旋鎖不阻擋時速度更快,這就是爲什麼它們在鎖中爭用非常少(即鎖定的可能性非常低)的情況下非常有用。

當一個線程休眠時,它會導致一個上下文切換(即,該線程被換出另一個線程,以便另一個線程可以運行)。獲取標準互斥鎖的開銷通常比檢查自旋鎖是否空閒的開銷要高。當鎖定空閒時,通常自旋鎖只需要一次原子操作。

這些屬性使自旋鎖對細顆粒鎖定有用,因爲使用較小的鎖可減少每個鎖的爭用。例如,我的一個項目有一個映射,其中約有200,000個條目同時被16個以上的線程訪問(企業服務器類型的東西)。每個條目有一個自旋鎖是非常有效的,因爲這個應用程序中的兩個線程嘗試同時擊中相同條目的機會很低。

0

當鎖定變爲可用時,自旋鎖允許緊密輪詢和更快的喚醒。 @Chris指出,它們也適用於非競爭鎖。我會說使用自旋鎖:

  1. 如果所有你關心的是你自己的應用程序的性能,又不想屈服於其他應用和你的應用程序有< =線程比內核的數量。 我仍然會考慮票據鎖,以優化緩存未命中......但它們也會旋轉,但會減少緩存未命中的次數。

  2. ,或者,如果你的鎖較少爭

相關問題