c++11 基于RAII思想的锁 lock_guard 类模板

设计思想与原理

实例构造时进行加锁,析构时进行解锁,利用栈上对象生命周期的特性,维护管理者锁的状态,锁的释放将会由操作系统去执行,避免了类似std::mutex等互斥锁上锁后,由于异常导致锁的unlock()不能执行到,导致程序阻塞。

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(); }
      
	 //adopt_lock_t告诉lock_guard,传递的锁__m是一个已经被占用的互斥锁
	 //用于管理已经被占用的锁
      lock_guard(mutex_type& __m, adopt_lock_t) noexcept : _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;
    };

adopt_lock_t的作用:

adopt_lock_t告诉lock_guard,传递的锁__m是一个已经被占用的互斥锁,不需要再次加锁。

假设某个线程已经获取了一个互斥锁,并且需要在工作完成后释放该锁,但需要在这段时间内保持锁的状态,以便其他线程不会同时访问共享资源
在此情况下,可以创建一个带有std::adopt_lock_t参数的std::lock_guard对象,以便在当前作用域结束时自动释放锁,并确保其他线程无法访问共享资源。
此时,std::lock_guard对象不会再次尝试获取锁,而是直接接管已经被占用的锁。

补充:

不支持拷贝和赋值,底层管理的锁是独一份的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值