condition_variable
是条件变量,通常和 mutex
搭配使用。
当 condition_variable
对象的某个 wait
函数被调用的时候,它使用 unique_lock
来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同的 condition_variable
对象上调用了 notification
函数来唤醒当前线程。
condition_variable
对象通常使用 unique_lock<mutex>
来等待,如果需要使用另外的 lockable
类型,可以使用 condition_variable_any
类。
1 | // condition_variable example |
- 只提供了默认构造函数。
- wait、wait_for、wait_until 方法
type | arg |
---|---|
unconditional | void wait (unique_lock |
predicate | template |
其中 pred
是一个可调用对象/方法,
- 它不接受任何参数
- 返回值必须可以被转化为
bool
unconditional
在线程被阻塞时,wait
函数会自动调用 lck.unlock()
来释放锁,使得其他被阻塞在锁竞争上的线程得以继续执行。
一旦当前线程被唤醒 notified
,wait
函数会重新调用 lck.lock()
,使得 lck
的状态和 wait
函数被调用时相同。
Predicate
只有当 pred
条件为 false
时调用 wait()
才会阻塞当前线程,并且在收到其他线程的通知后只有当 pred
为 true
时才会被解除阻塞。
举个栗子
下面是一个使用 pred
模式的 wait
实现的「单生产者-单消费者」模型:
1 | // condition_variable::wait (with predicate) |