在C++11中是否有与boost::shared_mutex
相当的东西?或者有其他解决方案可以处理C++11中的多读/单写情况吗?
我曾尝试将shared_mutex
引入C++11,但是失败了。不过它已被提议用于未来的标准中,这个提议在这里。
编辑:C++14接受了修订版本(N3659),详情请看这里。
这里提供了一个实现:
shared_timed_mutex
在 C++14 中引入;shared_mutex
看起来将在 C++1z 中出现(事实证明,通过放弃时间能力可以获得效率提升)。 - Yakk - Adam Nevraumont简单来说……并没有标准的C++ 读写锁 实现。
不过你有几个选择:
使用#1并自行实现可能会让人感到害怕,如果您做得不好可能会在代码中引入竞态条件。有一个参考实现可能会使工作变得更容易一些。
如果您想要平台无关的代码或者不想在代码中包含任何额外的库来实现诸如读写锁这样简单的东西,可以放弃#2。
而且,#3有几个注意事项大多数人都没有意识到:使用读写锁通常性能较差,并且具有比使用简单互斥锁等价实现更难理解的代码。这是因为读写锁实现背后需要进行额外的簿记处理。
我只能向您展示选项,真正的决定权在于您权衡每个选项的成本和收益,并选择最适合您的。
shared_mutex
类型,用于情况,其中拥有多个并发读取器的好处超过了shared_mutex
本身的性能成本。在C++11中没有与boost::shared_mutex
等效的东西。
然而,在C++14及以后版本中支持读写锁:
std::shared_timed_mutex
std::shared_mutex
两者之间的区别是std::shared_timed_mutex
添加了更多的时间操作。它实现了SharedTimedMutex概念,该概念是std::shared_mutex
实现的简单TimedMutex概念的扩展。
请记住,获取读写锁的锁比获取普通的std::mutex
的锁更加昂贵。因此,如果您经常进行短时间的读操作,则读写锁不会提高性能。它更适合于频繁且昂贵的读操作。引用Anthony Williams的文章:
另外,shared_mutex是一个争用点,因此不可扩展。对shared_mutex进行锁定必然会修改mutex的状态,即使是读锁也是一样。因此,持有shared_mutex状态的缓存行必须传输到执行锁定或解锁操作的任何处理器。即使对于读取线程,锁定shared_mutex的成本也比锁定简单std::mutex要高。这是功能的必要部分---shared_mutex可能的状态比mutex更多,代码必须正确处理它们。这个成本体现在对象的大小上(在您和我在POSIX中的实现中都包括简单的mutex和条件变量),以及锁定和解锁操作的性能方面。
boost::shared_mutex
被标准化委员会拒绝了。这可能与此相关:http://permalink.gmane.org/gmane.comp.lib.boost.devel/211180 - Andy Prowl