我正在尝试将我的一个Linux项目移植到Windows。
在项目中我使用pthread_cond_t,为了能够等待,需要一个pthread_mutex_t。
它们都隐藏在不同的类别中,锁定/等待它们都应该支持timedwait
现在,在linux中,所有文档都很简单,但在Windows上我找不到任何文档,也没有任何与之相关的问题。
我知道有CONDITION_VARIABLE但它们仅适用于根据Windows文档无法定时的CRITICAL_SECTION,当然还有CONDITION_VARIABLE不能使用的HANDLE互斥锁。
我不想使用任何boost或ace内置对象或任何东西,我正在寻找纯粹的操作系统功能。
我有什么遗漏吗?
答案 0 :(得分: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资源和电能,你应该使用例如互斥原语。