在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資源和電能,而應該使用例如互斥體原語。
SleepConditionVariableCS採用超時並等同於pthread_cond_timedwait()。 –
我知道,但後來CONDITION_VARIABLE是在一個類和CRITICAL_SECTION是在一個類,但CRITICAL_SECTION不能等待,這是必須的。 – atlanteh