在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