条件变量与互斥锁
时间: 2025-06-14 07:42:01 浏览: 11
### 条件变量与互斥锁的关系及用法
#### 关系概述
条件变量和互斥锁都是多线程编程中的重要工具,但它们的功能不同。互斥锁主要用于保护共享资源的访问权限,确保同一时间只有一个线程可以修改这些资源[^1]。而条件变量则用于实现线程间的通信机制,使某个线程能够在特定条件下被唤醒或阻塞[^2]。
两者通常需要配合使用,因为条件变量本身并不提供数据一致性保障。当一个线程通过条件变量等待某些事件发生时,它会释放关联的互斥锁;而在重新获得锁之后才会继续执行逻辑[^3]。
---
#### 配合使用的典型场景
在实际应用中,条件变量常用来协调生产者-消费者模型或其他类似的协作模式下多个线程的行为:
1. **初始化阶段**
创建并初始化互斥锁 `mutex` 和条件变量 `cond`。
2. **等待状态设置**
当前线程进入等待前需持有互斥锁,并检查是否满足退出等待的状态条件(一般采用循环检测的方式)。如果不满足,则调用 `pthread_cond_wait(&cond, &mutex)` 将当前线程挂起,同时自动释放互斥锁[^5]。
3. **通知其他线程**
在另一个线程完成相应工作后,应先获取互斥锁再更新共享数据结构,随后调用 `pthread_cond_signal()` 或 `pthread_cond_broadcast()` 唤醒正在等待的一个或多条目标线程[^4]。
以下是基于 C++ 的简单代码示例展示两者的交互过程:
```cpp
#include <iostream>
#include <thread>
#include <condition_variable>
#include <mutex>
std::condition_variable cv;
std::mutex mtx;
bool ready = false;
void worker_thread() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return ready; }); // 等待ready变为true
std::cout << "Worker thread is processing..." << std::endl;
}
int main() {
std::thread t(worker_thread);
{
std::lock_guard<std::mutex> lock(mtx); // 修改共享变量时加锁
ready = true;
}
cv.notify_one(); // 通知worker线程继续运行
t.join();
return 0;
}
```
上述程序展示了主线程如何利用条件变量来控制子线程何时开始处理任务。
---
#### 主要区别总结
| 特性 | 互斥锁 | 条件变量 |
|-----------------|----------------------------------|------------------------------|
| 功能定位 | 控制对共享资源的独占访问 | 实现线程间高效通讯 |
| 是否涉及等待 | 不具备主动等待功能 | 支持线程休眠直至指定条件成立 |
| 数据一致性的维护 | 自动保证 | 需依赖外部手段 |
尽管如此,在很多情况下二者密不可分——只有结合才能有效解决复杂的并发问题。
---
阅读全文
相关推荐



















