据我所知,在旧版本的Boost中,Windows平台上的boost::mutex实现是使用临界区域完成的。但在最新版本的Boost 1.51中,我发现现在mutex的实现基于事件。
有人知道这个变化背后的原因吗?是出于性能方面的考虑吗?临界区域已经被弃用了吗?
boost
,我们总是能够以最佳方式进行操作,而不需要进行任何更改,这难道不是很棒吗?在新版本的 boost
中,boost::mutex
被实现为自旋锁,但是通过使用 Windows 事件来避免繁忙等待,并且只在需要时创建该事件,因此它非常轻量级、性能非常高,并且还可以使 boost
使用这种轻量级的 mutex
进行定时等待!我认为这非常出色。boost
的许多部分都依赖于使用原子变量实现的自旋锁,例如看一下 boost::shared_ptr
和 boost::detail::spinlock
的实现,并编写一个小程序来比较该自旋锁实现与在 Windows 和 *nix 系统上实现的最快锁之间的性能,你会发现结果很棒! - BigBossboost::mutex
并没有使用自旋锁!它使用原子操作作为优化:当获取锁时,它首先(原子地)检查一个变量,该变量指示互斥量当前是否被锁定。如果未锁定,则可以继续(根本不需要考虑 win32 事件),这是快速路径。如果检查结果表明互斥量已被锁定,则会使用(更)昂贵的 win32 操作。但这里根本没有自旋锁;-) - Frunsi
mutex
、timed_mutex
、try_mutex
都是使用detail::basic_timed_mutex
实现的,该实现无法使用CS。(实际上,使用CS并不总是最佳选择,它取决于并发场景,因此不值得为此复杂化设计。) - Igor R.