这让我困惑了很长时间。
给出基本的原子基元,如compare& swap,我可以看到如何实现自旋锁(我可以从中构建互斥锁)。
但是,我不知道如何构建条件变量。这是怎么做到的?
答案 0 :(得分:1)
这不是特别简单。以下是Douglas Schmidt(他也主要负责ACE库)的论文链接,其中详细介绍了使用Win32(Vista之前版本)中提供的同步原语在Windows上实现条件变量的几种方法。这些方法包括仅使用基本的,通常可用于任何OS原语,并讨论了这些方法的各种限制:
底线(结束语):
本文说明了为什么在Win32平台上开发条件变量很棘手且容易出错。开发人员必须解决几个微妙的设计力量。一般而言,我们检查的不同实现方式根据其正确性,效率,公平性和可移植性而有所不同。没有一种解决方案可以最佳地提供所有这些品质。
如果公平至关重要,第3.4节中的
SignalObjectsAndWait
解决方案是一个很好的方法。但是,这种方法不如其他解决方案有效,也不像便携式方法那样有效。因此,如果效率或可移植性比公平性更重要,则第3.2节中描述的SetEvent
方法可能更合适。当然,最简单的解决方案是让Microsoft在Win32 API中简单地提供条件变量。
请注意,从Vista开始,Windows支持使用本机API的条件变量: