2013-04-25 110 views
2

This question詢問是否可以改善自旋鎖的方式不會影響等待時間,但佔用更少的CPU時間。大量的答案顯示了C++ 11,Boost等中的高級語言概念。信號量與自旋鎖在實踐中有多昂貴?

我的第一個想法是使用一個簡單的C信號量,因爲只有當緩衝區爲空或滿時,海報需要阻塞。

然而,在編寫答案的過程中,我意識到我不知道這些函數的開銷在實踐中。直觀地說,它看起來應該很小,對我來說它從來都不是一個優化問題,但是對於自旋鎖來說,它可能是實質性的。據推測它也是系統依賴的。

this question的回答表明,當鎖定少於一個線程量時,首選自旋鎖定,但沒有給出關於原因的真實世界指示。

this question的答案提供了一個C++中的信號量實現的工作示例,該實例在主體中使用帶pthread_wait的自旋鎖,但它不是從任何實際的語言實現中獲取的。

here以上,有關互斥體和信號量之間的速度差異的問題被聲明爲不重要。其他人則說信號量比較慢。

一篇鏈接到this question的文章表明,對於互斥鎖的C#鎖定命令在2.4GhZ機器上的實踐中花費了50ns(如此~100個週期)。然而,目前還不清楚C#的實現是否具有代表性,即POSIX信號量的直接C實現。

所以,問題是,什麼是在實踐中像信號使用的開銷,並推而廣之,我什麼時候應該更喜歡一個自旋鎖,如果我所關心的是延遲(即不是由於某種原因,可維護性)?

+0

有點依賴......很多東西。通常有更多的核心比就緒線程多嗎?對一個被禁止的原子整數的緊密循環的空閒內存帶寬有什麼影響?什麼是鎖定跨度 - 您是否在鎖定或指針/智能指針中複製大對象? – 2013-04-26 00:11:21

+0

信號量和互斥量通常會轉化爲慢的內核(窗口),spinlocks不會(除非你耗盡你的時間片)。有一篇非常好的研究論文報道了這篇文章(論文是鎖定自由鎖定的,但我找不到它!)。本文http://msdn.microsoft.com/en-us/magazine/cc163726.aspx也有一些好的一點。 – rlb 2013-04-26 04:59:23

回答

1

我絕不是這方面的專家,所以你應該根據你的情況採取我的建議。

自旋鎖使用原子性質的處理器指令實現。因此,獲取和釋放鎖可能非常快。鎖定時間越長,鎖定的爭用就越多,這種理想的性能會降低。因此它最適合於不常更新的數據。 Afaik .NET(4.0+)擁有自己的託管旋轉鎖定實現,避免了轉換到非託管代碼(以及隨後的內核訪問),這使得開銷非常微不足道。

幾乎所有其他鎖類型都基於WaitHandles(.NET-land中的例外是受管唯一的Monitor類),除非您正在編寫在內核空間中運行的設備驅動程序,否則性能爲可能不會變化太大(因爲大部分成本是向內核空間的過渡並返回)。選擇最適合您應用需求的鎖定類型。

如果您真的很在意它,可以組合一些模擬預期工作負載的性能測試,然後基準您的首選選項以查看它們的堆疊方式。

+0

+1 - 對我來說聽起來不錯 - 在您自己的應用程序/硬件/操作系統上測試它。 – 2013-04-26 00:12:20