您好我有一些代码是通过unsing #ifdef OS,
进行跨平台的我有一个受Windows上的CriticalSection保护的队列,以及Linux上的pthread_mutex_t保护。
我想实现一个Wait(超时)调用,它会阻塞一个线程,直到某些东西被排队。我虽然在Windows上使用WaitForSingleObject但它似乎不支持CriticalSection。我应该使用哪个Win32和哪些Linux函数来等待和发出信号以便发生条件。
感谢
答案 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;
如果内存服务,使用它的基本思路就是:
答案 3 :(得分:0)
似乎条件变量是我正在寻找的。 p>
在Windows上它们使用关键的Section和SleepConditionVariableCS
在linux上pthread_cond_timedwait使用pthread。
谢谢大家。
答案 4 :(得分:0)
使用pthread,一个条件变量。
在Windows上,看起来你想要一个信号量。 Win32信号量有一个从零开始的计数器 - 此时手柄没有信号。当您向队列中添加项目时,您将使用ReleaseSemaphore增加信号量计数器 - 添加到信号量的每个计数将满足对WaitforXXXObject函数的一次调用,因此,如果您向队列添加了3个项目,则会释放ReleaseSemaphore等于3. WaitFor ...然后在句柄再次发出信号之前返回3次。