我们用条件变量管理 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理解为资源本身,而非资源句柄。
