递归锁 std::recursive_mutex和std::lock_guard结合使用

最近做redis连接池的时候,需要加锁保证redisContext在同一时刻只能被一个线程使用

但是在加锁的时候头疼了,有一些针对redisContext的操作是相互调用的,而这些操作也都是需要可以独立进行的。

简单来说,问题就是:加锁的操作需要相互嵌套,如果使用std::mutex 肯定会导致死锁,而重构代码,提取出共用部分的工作量又很大。

这个时候我发现了好东西 std::recursive_mutex 递归锁

递归锁可以允许一个线程对同一互斥量多次加锁,解锁时,需要调用与lock()相同次数的unlock()才能释放使用权

这边再介绍一个好东西:

std::lock_guard 

std::lock_guard在构造函数中加锁,在析构函数中解锁,利用这个类可以减少我们对加锁可解锁操作的管理工作,专注于逻辑实现。

lock_guard类结构如下

template
    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;
    };

可以很清楚的看到加锁和解锁过程

通过这两个类的使用可以很方便地进行加锁和解锁操作,真香

你可能感兴趣的:(编程语言)