我希望在Win32上具有POSIX样式条件变量。我有一些需要在XP上运行的代码,因此无法使用Vista/Server 2008的CONDITION_VARIABLE

它当前使用的是伪条件变量类,它基于离开临界区并发出自动复位事件的信号,以发出信号/唤醒。为了等待条件变量,它将关键部分WaitForSingleObject留在事件上,然后重新输入关键部分。这在大多数情况下都可以,但是它不支持广播,并且在公平性方面可能还有其他问题,我对此不太在意。

我们确实使用了boost,所以我知道我可以使用支持条件变量的boost线程或pthreads-win32,但是理想情况下,我希望接口(interface)是这样的,以便在可能时使用Microsoft实现。它直接。我见过Strategies for Implenting POSIX Condition Variables on Win32,但是“最佳”(最正确)的解决方案使用Mutex而不是CRITICAL_SECTION。在second part中有一个带有CRITICAL_SECTION的实现的草图,但是它并不完整,由于本文为他们概述了这些担忧,其他带有CRITICAL_SECTION的解决方案也使我感到担忧。

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

最佳答案

您所引用的论文是我的同事撰写的,这是我们在ACE C++框架及其OS包装外观方面的成果。正如我的履历中提到的,“我不使用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的一名员工。我不认为这会为您更改此代码的实用性/适用性,也不会提及任何上述实体从您的源代码中提炼代码而获得 yield 。

关于c - 为XP的Winthreads实现CRITICAL_SECTIONs的条件变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1218716/

10-13 06:59