【问题标题】:Implementing condition variables for CRITICAL_SECTIONs for Winthreads for XP为 XP 的 Winthreads 实现 CRITICAL_SECTIONs 的条件变量
【发布时间】:2010-11-16 03:57:39
【问题描述】:

我希望在 Win32 上使用 POSIX 样式的条件变量。我有一些代码需要在 XP 上运行,所以我不能使用 Vista/Server 2008 的CONDITION_VARIABLE

目前它使用了一个伪条件变量类,它基于离开临界区并发出一个自动重置事件来发出信号/唤醒。为了等待条件变量,它离开临界区,WaitForSingleObjects 在事件上,然后重新进入临界区。这大部分都很好,但它不支持广播,并且可能还有其他关于公平性的问题,我不太关心。

我们确实使用了 boost,所以我知道我可以使用 boost 线程或 pthreads-win32,它们支持条件变量,但理想情况下,我希望接口能够在 Microsoft 实现时/如果它变为可以直接使用。我见过Strategies for Implenting POSIX Condition Variables on Win32,但“最好的”(最正确的)解决方案使用互斥锁而不是CRITICAL_SECTION。在second part 中有一个带有CRITICAL_SECTION 的实现草图,但它并不完整,由于文章中为它们概述的问题,带有CRITICAL_SECTIONs 的其他解决方案让我很担心。

简而言之,我如何在 win32 上为关键部分实现正确但不一定公平(但那会很好)的条件变量,以便我可以在 Microsoft 的实现对我可用时放弃它?

【问题讨论】:

    标签: c winapi multithreading


    【解决方案1】:

    您提到的论文是我的同事撰写的,是我们在 ACE C++ 框架及其操作系统包装外观方面工作的产物。正如我的简历中提到的,“我不做 Windows”,但我仍然积极地在 ACE 上工作,我只是看了看,似乎 Win32 的条件变量实现使用了CRITICAL_SECTION(初步检查看起来就像它只是使用互斥锁一样,但是如果您深入挖掘,您会发现下面有一层互斥锁在Windows平台上定义为CRITICAL_SECTION

    仅供参考,为了确保代码没有被修改以使用新的 Vista API,我检查的代码库实际上是 1.5 行的一个分支。

    假设您只想要一个用于条件变量的 C API,而不是围绕它的 C++ 包装器,所有这些都应该包含在一组文件中:ace/OS_NS_Thread.{h,inl,cpp} ACE 上的许可证非常慷慨,而不是 GPL,所以您可以将代码从那里提升到专有代码库,而不必担心“GPL 污染”。

    您可以在http://download.dre.vanderbilt.edu/ 获取ACE 的版本;我检查的版本是从 ACE 5.5.2 派生的商业支持版本,由 OCI 维护,可在 http://www.theaceorb.com/downloads/1.5a/index.html 下载。

    为了全面披露,我一直是 ACE 的长期用户/贡献者/维护者,曾在该研究人员工作过一段时间,现在是 OCI 的一名员工。我认为这不会为您更改此代码的实用性/适用性,上述任何实体也不会从您从源代码中提取代码中获得收入。

    【讨论】:

      猜你喜欢
      • 2012-06-15
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 2017-05-13
      • 2011-07-18
      • 1970-01-01
      • 2017-10-26
      相关资源
      最近更新 更多