最近做redis连接池的时候,需要加锁保证redisContext在同一时刻只能被一个线程使用
但是在加锁的时候头疼了,有一些针对redisContext的操作是相互调用的,而这些操作也都是需要可以独立进行的。
简单来说,问题就是:加锁的操作需要相互嵌套,如果使用std::mutex 肯定会导致死锁,而重构代码,提取出共用部分的工作量又很大。
这个时候我发现了好东西 std::recursive_mutex 递归锁
递归锁可以允许一个线程对同一互斥量多次加锁,解锁时,需要调用与lock()相同次数的unlock()才能释放使用权
这边再介绍一个好东西:
std::lock_guard<std::recursive_mutex>
std::lock_guard在构造函数中加锁,在析构函数中解锁,利用这个类可以减少我们对加锁可解锁操作的管理工作,专注于逻辑实现。
lock_guard类结构如下
template<typename _Mutex>
class lock_guard
{
public:
typedef _Mutex mutex_type;
explicit lock_guard(mutex_type& __m) : _M_device(__m)
{ _M_device.lock(); }
lock_guard(mutex_type& __m, adopt_lock_t) : _M_device(__m)
{ } // calling thread owns mutex
~lock_guard()
{ _M_device.unlock(); }
lock_guard(const lock_guard&) = delete;
lock_guard& operator=(const lock_guard&) = delete;
private:
mutex_type& _M_device;
};
可以很清楚的看到加锁和解锁过程
通过这两个类的使用可以很方便地进行加锁和解锁操作,真香