目录一、lock_guard 与 unique_lock 介绍1. lock_guard简单安全2. unique_lock灵活3.两种锁包装器的对比二、使用示例1. lock_guard 基本用法2. unique_lock 灵活用法延迟加锁 手动解锁3. unique_lock 与条件变量配合三、总结一、lock_guard与unique_lock介绍两者都是 C11 起提供的RAII 风格锁包装器用于自动管理mutex的加锁 / 解锁避免因异常或提前返回导致的死锁。1.lock_guard简单安全核心特点构造时自动加锁析构时自动解锁不支持手动加锁 / 解锁也不可移动或拷贝。适用场景仅需简单保护临界区无需灵活控制锁的时机。构造选项直接传入mutex立即加锁。配合std::adopt_lock接管已加锁的mutex不重复加锁。2.unique_lock灵活核心特点支持手动加锁 / 解锁、延迟加锁、移动语义不可拷贝可与条件变量配合使用。适用场景需要灵活控制锁的生命周期如提前解锁、延迟加锁或与std::condition_variable配合。构造选项std::defer_lock延迟加锁构造时不加锁后续需手动调用lock()。std::try_to_lock尝试加锁不阻塞通过owns_lock()判断是否成功。std::adopt_lock接管已加锁的mutex。3.两种锁包装器的对比特性lock_guardunique_lock灵活性低仅自动加锁 / 解锁高支持手动控制、移动等性能开销略小无额外状态管理略大需维护锁状态与条件变量配合不支持支持condition_variable::wait必须用适用场景简单临界区保护复杂场景延迟加锁、条件变量等二、使用示例1.lock_guard基本用法#include mutex #include iostream std::mutex mtx; int shared_data 0; void increment() { std::lock_guardstd::mutex guard(mtx); // 自动加锁 shared_data; // 离开作用域guard 析构自动解锁 }2.unique_lock灵活用法延迟加锁 手动解锁#include mutex std::mutex mtx; void flexible_lock() { std::unique_lockstd::mutex lock(mtx, std::defer_lock); // 暂不加锁 // ... 做一些不需要锁的操作 ... lock.lock(); // 手动加锁 // ... 临界区操作 ... lock.unlock(); // 提前解锁可选 // ... 后续操作 ... } // 若仍持有锁析构时会自动解锁3.unique_lock与条件变量配合#include mutex #include condition_variable #include queue std::mutex mtx; std::condition_variable cv; std::queueint data_queue; void consumer() { std::unique_lockstd::mutex lock(mtx); cv.wait(lock, []{ return !data_queue.empty(); }); // 自动解锁等待满足条件后重新加锁 int data data_queue.front(); data_queue.pop(); }三、总结优先用lock_guard简单高效满足基本临界区保护需求。需灵活控制或条件变量时用unique_lock适配复杂场景。感谢阅读本文如有错漏之处烦请斧正。