首先这个两个都是 non-copyable,但是 unique_lock 可以转移(提供了移动构造和移动赋值函数,类似于 unique_ptr),lock_guard 只能在构造 lock 在析构时 unlock
建议在看之前先去 cppreference 了解一下 lock_guard 和 unique_lock 的基本用法:
- lock_guard: https://en.cppreference.com/w/cpp/thread/lock_guard
- unique_lock: https://en.cppreference.com/w/cpp/thread/unique_lock
参考 stackoverflow 几个高赞回答
-
除非你需要在不销毁锁的情况下手动解锁互斥锁,否则请使用 lock_guard,也就是说一般情况下不需要手动释放 mutex,lock_guard 足矣
-
特别是,当调用 wait 时,condition_variable 会在进入睡眠时解锁其互斥锁。这就是为什么在这里lock_guard 不足够的原因。 C++17 之后,请考虑使用 scoped_lock 替代 lock_guard
-
unique_lock 可以在构造时不立即 lock 互斥锁,结合 std::defer_lock 可以实现 RAII wrapper(锁住多个 mutex),lock_guard 也能提供 RAII wrapper(使用括弧限制一个 limited space)
// unique_lock 提供的 RAII wrapper
void transfer(Box &from, Box &to, int num)
{
// don't actually take the locks yet
std::unique_lock lock1{from.m, std::defer_lock};
std::unique_lock lock2{to.m, std::defer_lock};
// lock both unique_locks without deadlock
std::lock(lock1, lock2);
from.num_things -= num;
to.num_things += num;
// 'from.m' and 'to.m' mutexes unlocked in 'unique_lock' dtors
}
// lock_guard 提供的 RAII wrapper
class MyClass{
std::mutex my_mutex;
void member_foo() {
std::lock_guard<mutex_type> lock(this->my_mutex);
/*
block of code which needs mutual exclusion (e.g. open the same
file in multiple threads).
*/
//mutex is automatically released when lock goes out of scope
}
};
原文参考: