C++ 互斥量、锁与条件变量详解
1. 互斥量(Mutex)
- 定义:互斥量是 C++ 多线程编程中用于保护共享资源的同步机制,确保同一时间只有一个线程可以访问特定代码段或资源。
- 核心 API:
std::mutex:基本互斥锁,需手动管理锁的生命周期。std::lock_guard:RAII 风格的锁管理,构造时自动上锁,析构时自动解锁。std::unique_lock:更灵活的锁管理,支持手动控制锁的生命周期。
2. 锁(Lock)
- 作用:锁是互斥量的执行单元,通过
lock()和unlock()方法控制对共享资源的访问。 - 关键特性:
- 独占性:同一时刻仅允许一个线程持有锁,其他线程尝试加锁时会阻塞或失败。
- RAII:推荐使用
std::lock_guard和std::unique_lock实现自动锁管理,避免死锁。
3. 条件变量(Condition Variable)
- 定义:条件变量用于线程间等待特定条件成立并被其他线程唤醒的同步机制。
- 核心 API:
wait():阻塞线程直到被通知或条件成立。notify_one():唤醒一个等待线程。notify_all():唤醒所有等待线程。
- 使用场景:线程 A 等待队列非空,线程 B 推入任务并通知 A。
4. std::lock_guard 与 std::unique_lock 区别
| 特性 | std::lock_guard | std::unique_lock |
|---|---|---|
| 设计目标 | 简单、高效、不可手动控制锁 | 灵活、支持手动控制锁、条件变量配合 |
| RAII 管理 | 自动加锁/解锁,生命周期结束自动释放 | 自动加锁/解锁,支持延迟加锁、手动控制 |
| 锁所有权 | 无所有权转移,不可复制 | 支持所有权转移(可移动) |
| 条件变量 | 不支持(需 std::unique_lock) | 支持(参数传递给 std::condition_variable::wait()) |
- 锁控制能力:
std::lock_guard:构造时立即加锁,析构时自动解锁,不支持中途释放或重新获取锁。std::unique_lock:支持延迟加锁(std::defer_lock)、手动加锁/解锁(lock()/unlock()),适合复杂场景。
- 所有权管理:


