C ++ Win / Linux线程同步事件

时间:2010-05-10 17:16:22

标签: c++ windows linux multithreading signals

您好我有一些代码是通过unsing #ifdef OS,

进行跨平台的

我有一个受Windows上的CriticalSection保护的队列,以及Linux上的pthread_mutex_t保护。

我想实现一个Wait(超时)调用,它会阻塞一个线程,直到某些东西被排队。我虽然在Windows上使用WaitForSingleObject但它似乎不支持CriticalSection。我应该使用哪个Win32和哪些Linux函数来等待和发出信号以便发生条件。

感谢

5 个答案:

答案 0 :(得分:1)

我认为提升的条件可能就是你所需要的。它是跨平台的,因此根据操作系统的不同,您不必费心使用不同的实现。

另一种方法是使用带有WaitForSingleObject()的Windows事件和带有eventfd()select()的全新Linux poll()

答案 1 :(得分:0)

使用Boost将允许您在没有一堆ifdef的情况下为两个平台进行线程化和同步。

答案 2 :(得分:0)

您可以(使用TryEnterCriticalSection模拟尝试超时,但在大多数情况下,如果您想要超时,最好使用mutex代替(当您获得时)到此为止,关键部分主要是互斥体的包装。)

另一种可能性是使用Win32 pthreads库,这可能会让你的Linux代码在Win32下编译不变(你只需要删除自己的Win32代码)。

这非常类似于已添加到C ++ 0x库的线程支持,尽管它没有(甚至尝试)精确地遵循新标准。如果你想遵循这个标准,你可以使用Anthony Williams的Just Thread库(警告:价格相当合理,但在任何意义上都不是免费的)。

编辑(回应Billy O'neal的问题):考虑一下,实际上 源代码很容易获得,显示了大部分正在发生的事情。 CRITICAL_SECTION数据结构在winbase.h中定义为RTL_CRITICAL_SECTION的typedef。反过来,它在WinNT.h中定义为:

typedef struct _RTL_CRITICAL_SECTION {
    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;

    //
    //  The following three fields control entering and exiting the critical
    //  section for the resource
    //

    LONG LockCount;
    LONG RecursionCount;
    HANDLE OwningThread;        // from the thread's ClientId->UniqueThread
    HANDLE LockSemaphore;
    ULONG_PTR SpinCount;        // force size on 64-bit systems when packed
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;

如果内存服务,使用它的基本思路就是:

  1. 如果此线程已拥有临界区,则递增RecursionCount并返回
  2. 否则,SpinCount会尝试使用LockCount上的原子操作通过快速路径进入CS
  3. 否则,请等待LockSemaphore

答案 3 :(得分:0)

似乎条件变量是我正在寻找的。

在Windows上它们使用关键的Section和SleepConditionVariableCS

在linux上pthread_cond_timedwait使用pthread。

谢谢大家。

答案 4 :(得分:0)

使用pthread,一个条件变量。

在Windows上,看起来你想要一个信号量。 Win32信号量有一个从零开始的计数器 - 此时手柄没有信号。当您向队列中添加项目时,您将使用ReleaseSemaphore增加信号量计数器 - 添加到信号量的每个计数将满足对WaitforXXXObject函数的一次调用,因此,如果您向队列添加了3个项目,则会释放ReleaseSemaphore等于3. WaitFor ...然后在句柄再次发出信号之前返回3次。