一、读写锁
有过多语言编程的开发人员,往往在别的语言中(如Java等)看到过读写锁,它特别适合于在写少读多的情况下。一般在互联网的应用场景中,这种读非常多,写很少的场景非常普遍,所以读写锁其实应用非常多。
在C++中,原来没有这种所谓读写锁之说,只有轻量级锁和重量级锁。虽然可以通过这些锁来模拟实现读写锁,但毕竟不如原生库中带着好用。STL的发展就是要与时俱进,也要看到实际的应用需求,所以在C++14中推出了std::shared_lock。
std::shared_lock是一个通用的共享互斥体的封装,它允许延迟锁定、定时锁定和锁所有权的转移。其中使用的共享互斥体类似std::unique_lock中使用的排它性互斥体,有对比就好理解。因为它的锁是可共享的,所以它就实现了读锁的处理。写锁自然可以使用排它型锁std::unique_lock 或std::lock_gurad。
二、std::shared_lock
std::shared_lock的原理其实比较简单,先看一下其定义:
template<typename _Mutex>
class shared_lock
{
public:
typedef _Mutex mutex_type;
// Shared locking
shared_lock() noexcept : _M_pm(nullptr), _M_owns(false) {
}
explicit
shared_lock(mutex_type& __m)
: _M_pm(std::__addressof(__m)), _M_owns(true)
{
__m.lock_shared(); }
shared_lock(mutex_type& __m, defer_lock_t) noexcept
: _M_pm(std::__addressof(__m)), _M_owns(false) {
}
shared_lock(mutex_type& __m, try_to_lock_t)
: _M_pm(std::__addressof(__m)), _M_owns(__m.try_lock_shared()) {
}
shared_lock(mutex_type& __m, adopt_lock_t)
: _M_pm(std::__addressof(__m)), _M_owns(true) {
}
template<typename _Clock, typename _Duration>
shared_lock(mutex_type& __m,
const chrono