你好,我有一些代码是跨平台的,通过取消#ifdef OS,
在Windows上我有一个由CriticalSection保护的队列,在Linux上我有一个由pthread_mutex_t保护的队列。
我想实现一个等待(超时)调用,它会阻塞一个线程,直到有东西进入队列。我想过在windows上使用WaitForSingleObject,但它似乎不支持CriticalSection。我应该使用哪个Win32和哪个Linux函数来等待和通知条件的发生。
谢谢
发布于 2010-05-11 01:21:10
我认为boost的条件可能正是您所需要的。它是跨平台的,因此您不必为不同的操作系统实现而烦恼。
另一种选择是在WaitForSingleObject()中使用Windows Events,在select()或poll()中使用相当新的linux eventfd()。
发布于 2010-05-11 01:22:07
使用Boost将允许您在没有一堆ifdefs的情况下为两个平台执行线程和同步。
发布于 2010-05-11 01:27:52
您可以(在某种程度上)使用TryEnterCriticalSection来模拟一个带有超时的尝试,但在大多数情况下,如果您想要一个超时,最好使用mutex (当您开始讨论它时,临界区通常是一个互斥锁的包装器)。
另一种可能是使用Win32 pthreads库,它可能会让您的Win32代码在不变的情况下编译(并且您只需删除您自己的Win32代码)。
这与添加到C++ 0x库中的线程支持非常相似,尽管它并不(甚至尝试)严格遵循新标准。如果你想遵循这个标准,你可以使用Anthony Williams的Just Thread库(警告:价格相当合理,但在任何一种意义上都不是免费的)。
编辑(回答Billy O‘’neal的问题):再仔细考虑一下,实际上可以很容易地获得源代码,它显示了大多数正在发生的事情。在winbase.h中,CRITICAL_SECTION数据结构被定义为RTL_CRITICAL_SECTION的类型定义。反过来,在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;如果内存正常的话,关于如何使用它的基本思想是这样的:
等待如果此线程已拥有临界区,请在LockSemaphore上使用原子操作
https://stackoverflow.com/questions/2804790
复制相似问题