std::unique_lock比std::lock_guard更灵活但更易出错:前者支持延迟加锁、手动锁控、所有权转移及配合条件变量,后者仅适用于构造即锁、析构即锁的简单场景。

std::unique_lock 是 C++11 引入的可移动(moveable)、可延迟加锁、可手动控制加锁/解锁时机的互斥量包装器,比 std::lock_guard 更灵活,但也更易出错。
核心区别:灵活性 vs 简单性
两者都用于 RAII 方式管理互斥量(如 std::mutex),但设计目标不同:
- std::lock_guard:构造即加锁,析构即解锁,不可复制、不可移动,生命周期绑定严格,适合“进作用域就锁、出作用域就放”的简单场景。
-
std::unique_lock:构造时可选择不加锁(
std::defer_lock),支持手动调用lock()/unlock(),支持转移所有权(move),还能配合std::condition_variable等高级同步原语。
常见使用场景对比
用 lock_guard 的时候: 只在某段代码块内保护临界区,不需要中途释放锁、也不需要条件等待。
std::mutex mtx;
void safe_increment() {
std::lock_guard<std::mutex> lk(mtx); // 构造即锁
++counter; // 临界区
} // 析构自动解锁 —— 简洁安全登录后复制
必须用 unique_lock 的时候:
- 需要延迟加锁(比如先做检查再决定是否加锁)
- 要和
std::condition_variable::wait()配合(wait 要求锁可手动释放并重获) - 需要在函数内多次加锁/解锁(例如分阶段处理)
- 要把锁的所有权转移到另一个作用域(如返回一个带锁的资源)
典型 unique_lock 用法示例
✅ 延迟加锁:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~