unique_lock与lock_guard区别

使用方式

lock_guard:

  • 没有提供加锁和解锁的接口。
  • 通过构造函数和析构函数控制锁的作用范围,创造对象的时候加锁,离开作用域的时候解锁;

unique_lock:

  • 提供了lock()和unlock()接口,能记录现在处于上锁还是没上锁状态。
  • 可以通过构造函数和析构函数控制锁的作用范围。
    在构造函数中延时加锁,在需要的时候手动加锁和解锁。
    在析构的时候,会根据当前状态来决定是否要进行解锁(lock_guard就一定会解锁)。

赋值操作

unique_lock和lock_guard都不能复制
lock_guard不能移动,但是unique_lock可以移动。

// unique_lock 可以移动,不能复制
std::unique_lock<std::mutex> guard1(_mu);
std::unique_lock<std::mutex> guard2 = guard1;  // error
std::unique_lock<std::mutex> guard2 = std::move(guard1); // ok

// lock_guard 不能移动,不能复制
std::lock_guard<std::mutex> guard1(_mu);
std::lock_guard<std::mutex> guard2 = guard1;  // error
std::lock_guard<std::mutex> guard2 = std::move(guard1); // error

资源消耗

  • unique_lock更加灵活,因为它要维持mutex的状态,但也因此对于资源的消耗明显要大一些,同时效率也比lock_guard更低一点。
  • lock_guard虽然笨重一些,但是资源消耗相对要小一点。

另外,
unique_lock还在条件变量的使用时发挥作用,见我的博文互斥量与条件变量

参考链接:
std::unique_lock与std::lock_guard区别
[c++11]多线程编程(五)——unique_lock

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值