加载中...
条件变量是一种线程同步原语,允许线程在某个条件不满足时挂起等待,并在条件可能变化时被其他线程唤醒。它常与互斥锁配合,用于实现生产者消费者等协作模型。

| 类别 | 同步原语 |
| 配套 | 互斥锁 |
| 核心操作 | 等待/通知 |
| 典型模型 | 生产者消费者 |
条件变量是一种用于线程间协作等待的同步机制,它让线程在等待某个条件成立时释放锁并进入睡眠,当其他线程改变了状态并发出通知时再被唤醒重新竞争锁。条件变量本身不保存状态,必须与一个互斥锁和一个共享条件配合使用。
许多并发问题不仅需要互斥,还需要线程按某种条件协作,例如消费者要等到缓冲区非空、生产者要等到缓冲区未满。若用忙等待轮询会浪费CPU。条件变量提供等待和通知两个基本操作,使线程能高效地阻塞和唤醒,是构建阻塞队列、线程池、屏障等结构的基础。
生产者消费者模型是典型用例:生产者放入数据后通知非空条件,消费者取走数据后通知非满条件。线程池用条件变量让工作线程在任务队列为空时睡眠,有任务时被唤醒。POSIX的pthread_cond、C++的condition_variable、Java的Object等待通知都属此类。
问:为什么等待条件变量要用while循环而不是if?答:因为存在虚假唤醒,线程可能在条件未真正满足时被唤醒;而且被唤醒后重新拿锁期间条件可能又被别的线程改变,必须循环重新检查。
问:条件变量为什么要配合互斥锁?答:检查条件和进入等待之间若无锁保护会产生竞态,导致通知丢失。互斥锁保证条件判断与挂起是原子的,通知方修改条件也在锁保护下进行。

| 类别 | 同步原语 |
| 配套 | 互斥锁 |
| 核心操作 | 等待/通知 |
| 典型模型 | 生产者消费者 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧