代码之家  ›  专栏  ›  技术社区  ›  Logan Capaldo

为Winthreads for XP的关键_部分实现条件变量

  •  10
  • Logan Capaldo  · 技术社区  · 15 年前

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

    它当前使用了一个伪条件变量类,该类基于离开临界段并发出自动重置事件的信号,以发送信号/唤醒。等待条件变量时,它离开临界段, WaitForSingleObject s,然后重新进入关键部分。这基本上是好的,但它不支持广播,并且可能有其他关于公平的问题,我不太关心。

    我们确实使用boost,所以我知道我可以使用boost线程或pthreads-win32,它们支持条件变量,但理想情况下,我希望接口能够在可以直接使用它的情况下,插入到Microsoft实现中。我见过 Strategies for Implenting POSIX Condition Variables on Win32 ,但“最佳”(最正确)的解决方案使用互斥,而不是 CRITICAL_SECTION . 有一个带有 临界截面 second part ,但它并不完整,而其他解决方案 临界截面 由于文章中概述了对他们的关注,因此我感到担忧。

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

    1 回复  |  直到 15 年前
        1
  •  6
  •   Chris Cleeland    15 年前

    你提到的论文是由我的同事写的,是我们在ACE C++框架及其OS包装外观方面的成果。正如我的简历中提到的,“我不做Windows”,但我仍然积极地在ACE上工作,我只是看了看,Win32的条件变量实现似乎使用了 CRITICAL_SECTION (在最初的检查中,它看起来只是使用了一个互斥体,但是如果你深入研究,你会发现下面有一层互斥体被定义为 在windows平台上)。

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

    您可以通过以下网址获得ACE的发布: http://download.dre.vanderbilt.edu/ OCI 可从以下网址下载: http://www.theaceorb.com/downloads/1.5a/index.html .

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