C++面试题更新 2026-08-05

在 C++ 并发编程中,lock_guard 和 unique_lock 在使用场景和功能上有哪些主要区别?请分别说明它们的锁管理策略、是否支持手动解锁或转移所有权,以及各自适用的典型场景。

技术原理方案权衡C++

考察说明

考查对 C++ 标准库中两种常用锁封装类的理解,以及在不同并发场景下的选型能力。

回答思路

  1. 【回答框架 1】lock_guard 是 C++11 提供的简单锁管理类,采用 RAII 机制,构造时自动加锁,析构时自动解锁,不提供手动解锁或锁所有权转移的功能,因此开销小,适合锁保护范围固定的场景。
  2. 【回答框架 2】unique_lock 同样基于 RAII,但提供了更灵活的锁管理,支持构造时延迟加锁、手动 unlock 和 re-lock、锁所有权转移(通过移动语义),并可与条件变量结合使用,代价是内部额外维护锁状态,性能略低于 lock_guard。
  3. 【回答框架 3】在实际项目中,若只需在作用域内持锁,优先使用 lock_guard;若涉及条件变量等待、需要提前释放锁或延迟加锁等复杂逻辑,则应选择 unique_lock,以换取灵活性。
  4. 【回答框架 4】选型时还需注意锁的粒度:即使使用灵活锁类,也应尽量缩小临界区,避免长时间持锁导致性能下降或死锁风险。
  5. 【关键点 1】lock_guard 不提供手动解锁和所有权转移,unique_lock 支持这些操作
  6. 【关键点 2】与条件变量配合使用时必须用 unique_lock,因为需要临时 unlock 等待
  7. 【关键点 3】unique_lock 内部维护状态标志,构造和析构开销略大于 lock_guard
  8. 【关键点 4】默认无特殊要求时优先用 lock_guard 以减少开销
  9. 【易错点 1】误认为 unique_lock 一定比 lock_guard 更高效,实际相反,unique_lock 更重
  10. 【易错点 2】在不需要灵活性的场景使用 unique_lock 可能引入不必要的开销
  11. 【易错点 3】试图将 lock_guard 与条件变量结合使用会导致编译错误或逻辑错误