首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ Win/Linux线程同步事件

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

Stack Overflow用户
提问于 2010-05-11 01:16:22
回答 5查看 1.5K关注 0票数 0

你好,我有一些代码是跨平台的,通过取消#ifdef OS,

在Windows上我有一个由CriticalSection保护的队列,在Linux上我有一个由pthread_mutex_t保护的队列。

我想实现一个等待(超时)调用,它会阻塞一个线程,直到有东西进入队列。我想过在windows上使用WaitForSingleObject,但它似乎不支持CriticalSection。我应该使用哪个Win32和哪个Linux函数来等待和通知条件的发生。

谢谢

EN

回答 5

Stack Overflow用户

发布于 2010-05-11 01:21:10

我认为boost的条件可能正是您所需要的。它是跨平台的,因此您不必为不同的操作系统实现而烦恼。

另一种选择是在WaitForSingleObject()中使用Windows Events,在select()或poll()中使用相当新的linux eventfd()。

票数 1
EN

Stack Overflow用户

发布于 2010-05-11 01:22:07

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

票数 0
EN

Stack Overflow用户

发布于 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中定义为:

代码语言:javascript
复制
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上使用原子操作

  1. 递增RecursionCount和return
  2. Otherwise,do SpinCount尝试通过快速路径进入CS
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2804790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档