条件变量是如何实现的?

ano*_*non 5 mutex conditional-statements compare-and-swap

这让我困惑了很长时间。

给定基本的原子原语(例如比较和交换),我可以了解如何实现自旋锁(我可以从中构建互斥体)。

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

Mic*_*urr 2

这并不是特别简单。以下是 Douglas Schmidt(他主要负责 ACE 库)撰写的一篇论文的链接,该论文详细介绍了使用 Win32(Vista 之前)中可用的同步原语在 Windows 上实现条件变量的几种方法。这些方法仅使用基本的、通常在任何操作系统原语上可用的方法,并讨论了这些方法的各种限制:

底线(结束语):

本文说明了为什么在 Win32 平台上开发条件变量很棘手且容易出错。开发人员必须解决一些微妙的设计因素。一般来说,我们研究过的不同实现在正确性、效率、公平性和可移植性方面各不相同。没有一种解决方案能以最佳方式提供所有这些品质。

SignalObjectsAndWait如果公平性至关重要,第 3.4 节中的解决方案是一个好方法。然而,这种方法不如其他解决方案高效,也不那么便携。因此,如果效率或可移植性比公平更重要,则SetEvent3.2 节中描述的方法可能更合适。当然,最简单的解决方案是 Microsoft 在 Win32 API 中简单地提供条件变量。

请注意,从 Vista 开始,Windows 支持使用本机 API 的条件变量:

  • 第一个链接已失效。 (4认同)