它使用当前的伪条件变量类,其基于离开关键部分并且发出用于信令/唤醒的自动复位事件.为了等待条件变量,它将在事件上离开关键部分WaitForSingleObjects,然后重新输入关键部分.这是很好的,但它不支持广播,也可能有其他问题在公平性,我不在乎太多.
我们使用boost,所以我知道我可以使用boost线程或pthreads-win32,它支持条件变量,但是理想情况下,我希望接口能够在/当可以使用/它直接我已经看到了Strategies for Implenting POSIX Condition Variables on Win32,但是“最好的”(最正确的)解决方案使用了一个互斥而不是一个CRITICAL_SECTION.在second part中有一个CRITICAL_SECTION的实现草图,但它还不完整,其他解决方案与CRITICAL_SECTION关系到我,因为他们在文章中概述了这些问题.
简而言之,如何实现一个正确的,不一定公平的(但是这样很好),关于win32的条件变量是关键部分,这样我可以在微软的实现中放弃我吗?
FYI,为了确保代码没有被修改为使用新的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的雇员.我不认为这会改变这段代码的实用性/适用性,也不会导致您从源代码中提取代码的收入.