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还在条件变量的使用时发挥作用,见我的博文。