2014-02-10 43 views
0

我試圖將我的一個Linux項目移植到Windows。使用CONDITION_VARIABLE與互斥體HANDLE

在項目中,我使用pthread_cond_t,爲了能夠等待,需要一個pthread_mutex_t。
它們都隱藏在不同的類別中,它們的鎖定/等待都應該支持timedwait。
現在,在Linux中,它的所有文件和簡單,但在Windows上,我沒有找到任何文檔,也沒有任何與它有關的問題。

我知道有CONDITION_VARIABLEs,但他們只與CRITICAL_SECTIONs工作,它不能根據Windows文檔timedwaited,當然有CONDITION_VARIABLEs不工作的HANDLE互斥。

我不想使用任何提升或ace內置對象或任何東西,我正在尋找純粹的操作系統功能。

有什麼我錯過了嗎?

+1

SleepConditionVariableCS採用超時並等同於pthread_cond_timedwait()。 –

+0

我知道,但後來CONDITION_VARIABLE是在一個類和CRITICAL_SECTION是在一個類,但CRITICAL_SECTION不能等待,這是必須的。 – atlanteh

回答

0

在linux中它的所有文檔都很簡單並且很容易 - 因爲在Windows中有更多的同步原語,而且命名也不同。

我發現沒有文檔 - 我會開始with this article,但要小心它只涵蓋其中的一些。 This list涵蓋約50%的最流行的原始。

「CONDITION_VARIABLEs,但它們只與CRITICAL_SECTION一起使用」 - 也適用於Slim Reader/Writer(SRW)鎖。

如果您想要更好的答案,您應該告訴我們您的項目中同步原語需要哪些功能。

P.S.如果你正在創建高性能和可伸縮的任何東西,你就不應該封鎖線程。通常,Windows上最有效的多線程策略永遠不會等待任何同步原語,只能等待用戶/ IO子系統/網絡/其他外部源。不過,我明白,這樣的應用程序應該從一開始就設計出來,如果你從非Windows平臺移植,這是不可能實現的。

更新:爲學習目的,(即如果你不關心性能或等待時間或電能),你可以很容易地實現等待關鍵部分對象。請參閱示例代碼(未測試):然而

static const DWORD msSleepTime = 100; // default time to sleep waiting for the CS 
bool WaitForCriticalSection(LPCRITICAL_SECTION lpCriticalSection, DWORD msTimeout) 
{ 
    if(dwTimeout == INFINITE) 
    { 
     EnterCriticalSection(lpCriticalSection); 
     return true; 
    } 

    while(true) 
    { 
     if(TryEnterCriticalSection(lpCriticalSection)) 
      return true; 
     if(msTimeout <=0) 
      return false; 
     DWORD msToSleepTime = std::min(msTimeout, msSleepTime); 
     Sleep(msToSleepTime); 
     msTimeout -= msToSleepTime; 
    } 
} 

對於任何生產質量系統,這種方法是不可接受的,並且不同的方法應該被代替使用。有一個很好的理由說明你爲什麼不能等待關鍵部分或SRW鎖:你不應該這樣做。它們都是爲輕量級用戶模式線程同步而設計的。通常情況下,你不應該鎖定它們超過幾毫秒。如果需要,這意味着使用臨界區域只是浪費CPU資源和電能,而應該使用例如互斥體原語。

+0

這是一個相當小的項目。移植主要用於Windows學習目的,我試圖儘可能保持api不變。 我的主要問題是:有無論如何獲得某種CONDITION_VARIABLE類和MUTEX類都是可以等待的,並且CONDITION_VARIABLE使用MUTEX來鎖定自己? – atlanteh

+0

請參閱更新 – Soonts

+0

Thx很多幫助!我試圖避免忙着等待,但似乎沒有這種情況下的選擇。 :)) – atlanteh