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實現。
所以,問題是,什麼是在實踐中像信號使用的開銷,並推而廣之,我什麼時候應該更喜歡一個自旋鎖,如果我所關心的是延遲(即不是由於某種原因,可維護性)?
有點依賴......很多東西。通常有更多的核心比就緒線程多嗎?對一個被禁止的原子整數的緊密循環的空閒內存帶寬有什麼影響?什麼是鎖定跨度 - 您是否在鎖定或指針/智能指針中複製大對象? – 2013-04-26 00:11:21
信號量和互斥量通常會轉化爲慢的內核(窗口),spinlocks不會(除非你耗盡你的時間片)。有一篇非常好的研究論文報道了這篇文章(論文是鎖定自由鎖定的,但我找不到它!)。本文http://msdn.microsoft.com/en-us/magazine/cc163726.aspx也有一些好的一點。 – rlb 2013-04-26 04:59:23