使用CONDITION_VARIABLE与互斥锁手柄

时间:2014-02-10 12:08:17

标签: c++ windows mutex condition-variable

我正在尝试将我的一个Linux项目移植到Windows。

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

我知道有CONDITION_VARIABLE但它们仅适用于根据Windows文档无法定时的CRITICAL_SECTION,当然还有CONDITION_VARIABLE不能使用的HANDLE互斥锁。

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

我有什么遗漏吗?

1 个答案:

答案 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资源和电能,你应该使用例如互斥原语。