4

这让我困惑了很久。

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

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

4

1 回答 1

2

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

底线(结束语):

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

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

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

于 2010-02-23T05:19:52.923 回答