条件变量是一种同步机制,允许线程在某个条件不满足时阻塞等待,并在条件满足时被唤醒。它本身不保存状态(信号可能丢失),必须和互斥锁(mutex)一起使用。
| 操作 | 作用 | 是否释放锁 |
|---|---|---|
| wait(cv, mutex) | 阻塞等待条件成立 | 释放 mutex |
| signal(cv) | 唤醒一个等待线程 | 不释放 mutex |
| broadcast(cv) | 唤醒所有等待线程 | 不释放 mutex |
// 等待方(消费者)
lock(mutex);
while (!condition) { // 用 while,不用 if(防止虚假唤醒)
wait(cv, mutex); // 释放 mutex 并阻塞
}
// 处理数据
unlock(mutex);
// 通知方(生产者)
lock(mutex);
// 设置条件为 true
signal(cv); // 唤醒一个等待线程
unlock(mutex);
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。