2014-02-10 45 views
0

我试图将我的一个Linux项目移植到Windows。使用CONDITION_VARIABLE与互斥体HANDLE

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

我知道有CONDITION_VARIABLEs,但他们只与CRITICAL_SECTIONs工作,它不能根据Windows文档timedwaited,当然有CONDITION_VARIABLEs不工作的HANDLE互斥。

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

有什么我错过了吗?

+1

SleepConditionVariableCS采用超时并等同于pthread_cond_timedwait()。 –

+0

我知道,但后来CONDITION_VARIABLE是在一个类和CRITICAL_SECTION是在一个类,但CRITICAL_SECTION不能等待,这是必须的。 – atlanteh

回答

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

+0

这是一个相当小的项目。移植主要用于Windows学习目的,我试图尽可能保持api不变。 我的主要问题是:有无论如何获得某种CONDITION_VARIABLE类和MUTEX类都是可以等待的,并且CONDITION_VARIABLE使用MUTEX来锁定自己? – atlanteh

+0

请参阅更新 – Soonts

+0

Thx很多帮助!我试图避免忙着等待,但似乎没有这种情况下的选择。 :)) – atlanteh