condition_variable成员函数
condition_variable 是 c++11 提供的一个可以实现线程同步的类。下面来总结一下条件变量condition_variable的用法。
1. condition_variable::wait()
成员函数wait()需要与unique_lock搭配使用。wait()函数有两种调用方法。
(一)void wait (unique_lock& lck);
只有一个参数,传入一个unique_lock对象就可以了。 condition_variable对象调用wait ()函数后,该线程会休眠,并且释放unique_lock对象所占有的锁。直到同一对象调用 notify_one() 或者 notify_all() ,该线程会被唤醒,并且不断去获取unique_lock对象的锁,直到获取成功,函数返回。
(二)template <class Predicate> void wait (unique_lock& lck, Predicate pred);
需要两个参数,第一个参数传入一个unique_lock对象,第二个参数需要传入一个可调用对象(函数,lambda表达式等)。调用wait()函数时,会先拿到unique_lock的锁,接着判断可调用对象的返回值是否为true,若为true函数返回,否则释放掉unique_lock对象所占有的锁,然后该线程休眠,直到同一对象调用 notify_one() 或者 notify_all() ,该线程会被唤醒,然后不断去获取unique_lock对象的锁,直到获取成功再次判断可调用对象的返回值真假,为true函数返回,为false再次休眠,直到下一次唤醒。
2.condition_variable::notify_one()
condition_variable对象调用notify_one()来唤醒任意一个被该对象wait()函数阻塞的线程。如果没有线程被该对象wait()函数阻塞,就什么也不做。
注意,只能唤醒同一对象的wait函数,而且是任意一个,当有多个线程线程被该对象wait()函数阻塞时,无法确定是哪一个被唤醒。
3. condition_variable::notify_all()
和condition_variable::notify_one()功能一致,区别在于condition_variable::notify_all()可以唤醒所有的被该对象阻塞的线程。
还有成员函数 condition_variable::wait_for()和condition_variable::wait_until()这里不做详细解释。
condition_variable 的使用
首先看一下用双重检查模拟多线程的队列缓冲区维护。
#include<thread>
#include<mutex>
#include<queue>
#include<stdio.h>
using namespace std;
queue