Boost互斥量在Windows平台的实现方式

5
据我所知,在旧版本的Boost中,Windows平台上的boost::mutex实现是使用临界区域完成的。但在最新版本的Boost 1.51中,我发现现在mutex的实现基于事件。

有人知道这个变化背后的原因吗?是出于性能方面的考虑吗?临界区域已经被弃用了吗?

你看过Boost的变更日志了吗? - PlasmaHH
1
据我所见,这是为了简化和统一各种互斥锁的设计而完成的:目前mutextimed_mutextry_mutex都是使用detail::basic_timed_mutex实现的,该实现无法使用CS。(实际上,使用CS并不总是最佳选择,它取决于并发场景,因此不值得为此复杂化设计。) - Igor R.
1
你应该意识到只有 Boost 的设计者才能完全回答这个问题,我们其他人只能猜测... - Tudor
1个回答

5
使用 boost,我们总是能够以最佳方式进行操作,而不需要进行任何更改,这难道不是很棒吗?在新版本的 boost 中,boost::mutex 被实现为自旋锁,但是通过使用 Windows 事件来避免繁忙等待,并且只在需要时创建该事件,因此它非常轻量级、性能非常高,并且还可以使 boost 使用这种轻量级的 mutex 进行定时等待!我认为这非常出色。

@Benj,谁说我们需要一个真正的自旋锁?boost 的许多部分都依赖于使用原子变量实现的自旋锁,例如看一下 boost::shared_ptrboost::detail::spinlock 的实现,并编写一个小程序来比较该自旋锁实现与在 Windows 和 *nix 系统上实现的最快锁之间的性能,你会发现结果很棒! - BigBoss
2
你的理解基本正确,但实际上 boost::mutex 并没有使用自旋锁!它使用原子操作作为优化:当获取锁时,它首先(原子地)检查一个变量,该变量指示互斥量当前是否被锁定。如果未锁定,则可以继续(根本不需要考虑 win32 事件),这是快速路径。如果检查结果表明互斥量已被锁定,则会使用(更)昂贵的 win32 操作。但这里根本没有自旋锁;-) - Frunsi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接