我们用条件变量管理 thread间的通信。一个 thread可等待(阻塞)在一个 condition_variable上,直至发生某个事件,如到达一个特定时刻或者另一个 thread完成。

    condition_variable(iso.30.5) lck必须是一个unique_lock<mutex>
    condition_variable cv{}; 默认构造函数:若某些系统资源无法获得,抛出system_error
    cv.~condition_variable() 析构函数;
    thread不会等待,也不会被通知
    cv.notify_one() 解除一个等待thread(如果有的话)的阻塞状态;
    不抛出异常
    cv.notify_all() 解除所有等待thread的阻塞状态;
    不抛出异常
    cv.wait(lck) lck必须被调用thread所拥有(例如生产者)
    调用原子操作lck.unlock()并阻塞;(释放锁,等待对方执行)
    当收到通知时解除阻塞,或”伪”唤醒;
    当解除阻塞是调用lck.lock()(执行任务,执行完成后再次释放)
    cv.wait(lck,pred) lck必须被调用thread所拥有
    while(!pred()) wait(lock)
    x=cv.wait_until(lck,tp) lck必须被调用thread所拥有;
    调用原子操作lck.unlock()并阻塞;
    当收到通知或时间已达tp时解除阻塞;
    当解除阻塞是调用lck.lock();
    若超时,x为timeout,否则x=no_timeout;
    b=cv.wait_until(lck,tp,pred) while(!pred())
    {
    if(wait_until(lck,tp)==cv_status::timeout);
    b=pred()
    }
    x=cv.wait_for(lck,d) x=cv.wait_until(lck,steady_clock::now()+d)
    b=cv.wait-for(lck,d,pred) b=cv.wait_until(lck,steady_clock::now()+d,move(pred))
    native_handle_type 参考iso.30.2.3
    nh=cv.native_handle() nh为cv的系统句柄

    condition_variable可能(也可能不)依赖系统资源,因此构造函数可能因该资源缺乏而失败。但是,类似 mutex, condition_variable也不能拷贝或移动,因此最好将 condition_variable理解为资源本身,而非资源句柄。