C++中mutex互斥锁用法lock_guard与unique_lock区别有哪些实战应用?
- 内容介绍
- 文章标签
- 相关推荐
本文共计852个文字,预计阅读时间需要4分钟。
直接说结论:
什么时候必须用 std::unique_lock?
不是“更高级所以更好”,而是有明确不可替代的使用场景:
-
std::condition_variable::wait()的参数类型强制要求是std::unique_lock——std::lock_guard不能传进去,编译直接报错 - 需要在加锁后做判断,再决定是否继续持有锁(比如双重检查):
lck.unlock()可提前释放,避免锁粒度过大 - 要尝试加锁且不阻塞:
lck.try_lock()或带超时的lck.try_lock_for(),lock_guard没有这些接口 - 要把锁对象作为函数返回值或存进容器(如
std::vector<:unique_lock>></:unique_lock>),因为unique_lock支持移动,lock_guard不支持
std::lock_guard 的典型误用:试图手动 unlock
有人写 guard.unlock() 想提前释放锁,但 std::lock_guard 根本没有 unlock() 成员函数 —— 编译失败。它只在构造时加锁、析构时自动解锁,没别的路可走。
本文共计852个文字,预计阅读时间需要4分钟。
直接说结论:
什么时候必须用 std::unique_lock?
不是“更高级所以更好”,而是有明确不可替代的使用场景:
-
std::condition_variable::wait()的参数类型强制要求是std::unique_lock——std::lock_guard不能传进去,编译直接报错 - 需要在加锁后做判断,再决定是否继续持有锁(比如双重检查):
lck.unlock()可提前释放,避免锁粒度过大 - 要尝试加锁且不阻塞:
lck.try_lock()或带超时的lck.try_lock_for(),lock_guard没有这些接口 - 要把锁对象作为函数返回值或存进容器(如
std::vector<:unique_lock>></:unique_lock>),因为unique_lock支持移动,lock_guard不支持
std::lock_guard 的典型误用:试图手动 unlock
有人写 guard.unlock() 想提前释放锁,但 std::lock_guard 根本没有 unlock() 成员函数 —— 编译失败。它只在构造时加锁、析构时自动解锁,没别的路可走。

