Log*_*ldo 10 c winapi multithreading
我想在Win32上使用POSIX样式条件变量.我有一些代码需要在XP上运行,所以我不能使用Vista/Server 2008 CONDITION_VARIABLE.
它当前使用伪条件变量类,其基于离开临界区并发信号通知用于信令/唤醒的自动重置事件.为了等待条件变量,它会WaitForSingleObject在事件中离开临界区,然后重新进入临界区.这很好,但它不支持广播,并且在公平性方面可能还有其他问题,我并不太关心.
我们确实使用boost,所以我知道我可以使用boost线程或pthreads-win32,它们支持条件变量,但理想情况下我希望接口是这样的,当我/可以使用它时可以放入Microsoft实现它直接.我已经看到在Win32上实现POSIX条件变量的策略,但"最佳"(最正确)的解决方案使用的是互斥锁,而不是CRITICAL_SECTION.CRITICAL_SECTION在第二部分中有一个带有a的实现的草图,但它并不完整,而其他解决方案与CRITICAL_SECTION我有关,因为文章中列出了他们所关注的问题.
简而言之,我如何在win32上为关键部分实现一个正确的,不一定公平的(但是那将是很好的)条件变量,这样当我可以使用时,我可以放弃Microsoft的实现?
你引用的论文是我的同事写的,是我们在ACE C++框架及其OS包装外观方面的工作成果.正如我的生物中所提到的,"我不做Windows",但我仍然积极研究ACE,我只是看一看,看起来Win32的条件变量实现使用CRITICAL_SECTION(在初始检查时它看起来像它只是使用互斥锁,但如果你深入挖掘,你会发现下面有一个层,其中一个互斥体被定义为CRITICAL_SECTION在windows平台上).
仅供参考,为了确保代码未被修改以使用新的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的员工.我认为这不会改变此代码的实用性/适用性,上述任何实体也不会从您的源代码中获取代码.
| 归档时间: |
|
| 查看次数: |
2633 次 |
| 最近记录: |