将CONDITION_VARIABLE与互斥体HANDLE一起使用

using CONDITION_VARIABLE with mutex HANDLE

本文关键字:HANDLE 一起 CONDITION VARIABLE      更新时间:2023-10-16

我正在尝试将我的一个linux项目移植到windows。

在这个项目中,我使用pthread_cond_t,为了能够等待,它需要pthread_mutex_t
它们都隐藏在不同的类中,它们的锁定/等待都应该支持timedwait
现在,在linux中,它都是文档化的,而且很容易,但在windows上,我找不到任何文档,也没有任何与之相关的问题。

我知道有CONDITION_VARIABLE,但它们只适用于根据windows文档无法进行时间编辑的CRITICAL_SECTIONs,当然还有CONDITION-VARIABLE不适用的HANDLE互斥。

我不想使用任何boost或ace内置对象或任何东西,我正在寻找纯操作系统功能。

这里有我遗漏的东西吗?

在linux中,这一切都有文档记录,而且很容易,因为Windows中有更多的同步原语,而且命名也不同。

我找不到任何文档-我会从这篇文章开始,但要注意它只涵盖了其中的一些。这个列表涵盖了大约50%的最受欢迎的原语。

"CONDITION_VARIABLEs,但它们仅适用于CRITICAL_SECTION"-也适用于Slim读写器(SRW)锁。

若您想要更好的答案,您可能应该告诉我们您需要从项目中的同步原语中获得什么功能。

附言:如果你正在创建任何高性能和可扩展的东西,你根本不应该阻塞线程。通常,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资源和电能,而应该使用例如互斥原语。