这让我很困惑。

给定基本的原子原语,例如compare&swap,我可以看到如何实现自旋锁(可以从中构建互斥体)。

但是,我看不到如何从中构建条件变量。怎么做?

最佳答案

这不是特别简单。以下是指向Douglas Schmidt(也是ACE库的主要负责人)的论文的链接,该论文详细介绍了几种使用Win32(Vista之前的版本)中的同步原语在Windows上实现条件变量的方法。这些方法包括仅使用基本的,通常可在任何OS原语上使用的方法,并讨论了这些方法的各种局限性:

  • http://www.cs.wustl.edu/~schmidt/win32-cv-1.html

  • 底线(结束语):

    本文说明了为什么在Win32平台上开发条件变量会很棘手且容易出错。开发人员必须解决几种微妙的设计力量。通常,我们研究的不同实现会根据其正确性,效率,公平性和可移植性而有所不同。没有一种解决方案可以最佳地提供所有这些质量。

    如果公平至高无上,则3.4节中的SignalObjectsAndWait解决方案是一种不错的方法。但是,这种方法不如其他解决方案有效,也不像可移植的。因此,如果效率或可移植性比公平性更重要,则第3.2节中描述的SetEvent方法可能更合适。自然,最简单的解决方案是Microsoft只需在Win32 API中提供条件变量。

    请注意,从Vista开始,Windows使用本机API支持条件变量:
  • http://msdn.microsoft.com/en-us/library/ms686903.aspx
  • 关于mutex - 条件变量如何实现?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2316264/

    10-10 06:09