2009-08-02 29 views
10

我對Win32上的POSIX樣式條件變量有所期望。我有一些代碼需要在XP上運行,所以我無法使用Vista/Server 2008的CONDITION_VARIABLE針對XP的Winthreads實現CRITICAL_SECTIONs的條件變量

當前使用了一個僞條件變量類,它基於離開關鍵部分併發信號通知/喚醒的自動重置事件。爲了等待條件變量,它將臨界區WaitForSingleObject置於事件上,然後重新進入臨界區。這很好,但它不支持廣播,可能還有其他關於公平的問題,我不太在意。

我們使用boost,所以我知道我可以使用boost線程或pthreads-win32,它支持條件變量,但理想情況下我希望這個接口能夠在/如果它可以放入Microsoft實現中變得可以直接使用它。我已經看到Strategies for Implenting POSIX Condition Variables on Win32,但「最好」(最正確的)解決方案使用Mutex而不是CRITICAL_SECTION。在second part中有一個CRITICAL_SECTION的實現草圖,但它不完整,其他解決方案由於我們在文章中爲他們概述的問題而關注我。

簡而言之,如何在關鍵部分的win32條件變量上實現正確的,不一定公平的(但那樣會很好),這樣我就可以在微軟的實現中放棄它的條件變量?

回答

6

您引用的論文是由我的同事編寫的,是我們在ACE C++框架及其OS封裝外觀方面的工作的延伸。正如在我的博客中提到的,「我不會做Windows」,但我仍然積極地研究ACE,並且我只是看了看,Win32的條件變量實現使用CRITICAL_SECTION(在初始檢查時,它看起來像是隻是使用互斥鎖,但如果深入挖掘,會發現下面有一個層,在Windows平臺上將互斥鎖定義爲CRITICAL_SECTION)。爲了確保代碼沒有被修改爲使用新的Vista API,我檢查的代碼庫實際上是1.5行中的一個分支。

假設你只是想爲條件變量提供一個C API,而不是C++包裝器,所有這些應該包含在一組文件中:ace/OS_NS_Thread.{h,inl,cpp} ACE上的許可證非常慷慨,而不是GPL,所以你可以將代碼從此處升級到專有代碼庫,而不用擔心「GPL污染」。

您可以在http://download.dre.vanderbilt.edu/獲得ACE的版本;我檢查的版本是由ACE 5.5.2衍生的商業支持版本,由OCI維護,並且可以在http://www.theaceorb.com/downloads/1.5a/index.html下載。爲了充分披露,我一直是ACE的長期用戶/貢獻者/維護者,曾在該研究人員工作過一段時間,現在是OCI的員工。我認爲這不會改變這段代碼的實用性/適用性,也沒有任何上述實體從源代碼中提取代碼。

+0

看起來不錯!非常感謝。 – 2009-08-05 23:49:37