条件变量需要和互斥量配合起来使用,C++11提供了两种条件变量:

  1. condition_variable:需要配合std::unique_lockstd::mutex进行wait操作,也就是阻塞线程的操作。
  2. condition_variable_any:可以和任意带有lock()、unlock()语义的mutex搭配使用,也就是说有四种:
    std::mutex:独占的非递归互斥锁
    std::timed_mutex:带超时的独占非递归互斥锁
    std::recursive_mutex:不带超时功能的递归互斥锁
    std::recursive_timed_mutex:带超时的递归互斥锁

条件变量通常用于生产者和消费者模型,大致使用过程如下:

拥有条件变量的线程获取互斥量
循环检查某个条件,如果条件不满足阻塞当前线程,否则线程继续向下执行
产品的数量达到上限,生产者阻塞,否则生产者一直生产。。。
产品的数量为零,消费者阻塞,否则消费者一直消费。。。
条件满足之后,可以调用notify_one()或者notify_all()唤醒一个或者所有被阻塞的线程
由消费者唤醒被阻塞的生产者,生产者解除阻塞继续生产。。。
由生产者唤醒被阻塞的消费者,消费者解除阻塞继续消费。。。

作者: 苏丙榅
链接: https://subingwen.cn/cpp/condition/
来源: 爱编程的大丙
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。