2011-10-10 129 views
3

我在閱讀this post關於給定測試用例的臨界區和互斥體之間的C#性能差異。我在懷疑是否有任何進一步的文檔給C++應用程序的各種鎖定類提供性能開銷,特別是在Windows 32或64位平臺上運行的MFC?C++中互斥鎖和臨界區之間的性能差異

我問的原因是,我在廣泛的自動化測試中得到的分析器結果顯示在互斥代碼中花費了大量時間。我試圖弄清楚的是,在等待資源變得可用的時候,這是多少是合理的延遲,以及鎖定結構的實現和具體情況。我只處理一個包含多個線程的進程,並且正在考慮更改爲關鍵部分。長期自動化測試表明,我不需要互斥類提供的超時。

因此,這個問題是否有人知道任何有關不同Windows平臺上不同MFC鎖定機制的性能開銷的參考文檔?

+2

鏈接問題的答案也完全適用於MFC。因爲像C#一樣,MFC類(如'CMutex'或'CCriticalSection')只不過是相應的Win32功能的包裝。 –

+0

感謝Christian,我有點期待這一點,但想知道結果是語言依賴的,是否依賴硬件等等,以及是否有任何關於表現的硬性信息。根據Mark Ingram的回答,建議臨界區域的MS文件只是「略快」而出現誤導。 –

回答

6

據我所知,一個Win32 Mutex是一個完整的內核對象。這意味着任何對互斥鎖的調用都將涉及系統調用。這通常會使緩存無效,因此可能會非常昂貴。

關鍵部分是用戶在沒有爭用的情況下不使用內核的對象。這可能是使用x86 LOCK彙編程序指令或類似的方法來保證原子性。由於沒有進行系統調用,速度會更快,但由於它不是內核對象,因此無法從另一個進程訪問關鍵部分。

+3

差不多。我認爲通過「......從另一個線程」你實際上是指「......來自另一個進程」。 – RobH

+0

感謝您的修復:) – doron

+0

感謝您的信息。聽起來就像我需要在各種平臺和條件下自己運行一些測試。 –

1

Windows中關鍵部分和互斥體之間的關鍵區別在於,您可以創建一個命名互斥體並在多個進程中使用它,而無法從另一個進程訪問一個進程的關鍵部分。

互斥鎖在多個進程中可用的結果是對其的訪問必須由內核控制。

1

請閱讀以下Microsoft的支持文章:http://support.microsoft.com/kb/105678

關鍵部分和互斥提供的同步非常相似,只是關鍵部分只能由單個進程的線程使用。當選擇在單個過程中使用哪種方法時,需要考慮兩個方面:

速度。在同步概述說以下有關關鍵部分:

...臨界區對象提供了一個稍快,更高效的 機制互斥同步。關鍵部分使用 處理器特定的測試和設置指令來確定相互排斥的 。

僵局。在同步概述說以下有關互斥:

如果一個線程終止不釋放其互斥 對象的所有權,該互斥體被認爲是放棄。等待線程 可以獲取已放棄的互斥鎖的所有權,但等待函數的返回值爲 表示該互斥鎖被放棄。 對於 被放棄的互斥體,WaitForSingleObject()將返回WAIT_ABANDONED。但是,互斥鎖正在保護的資源是 ,處於未知狀態。

無法判斷關鍵部分是否已被放棄。

+0

「稍快」這個詞在這裏讓我感興趣,因爲邁克爾在相關帖子中的回答表明速度提高了20倍以上。 –