概要
namespace boost { enum class cv_status; { no_timeout, timeout }; class condition_variable; class condition_variable_any; void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk); }
condition_variable与condition_variable_any类提供这样一个机制:一个线程可以等待来自另一个线程的通知,从而知道一个特定条件已经成真。
一般用法如下:
boost::condition_variable cond; boost::mutex mut; bool data_ready; void process_data(); void wait_for_data_to_process() { boost::unique_lock<boost::mutex> lock(mut); while(!data_ready) { cond.wait(lock); } process_data(); }
lock作为参数传给wait
wait将线程加入条件变量cond的线程集合中,并释放lock占用的mutex
在wait返回前,mutex再次被锁定
另外一个线程的代码可能是这样的
void retrieve_data(); void prepare_data(); void prepare_data_for_processing() { retrieve_data(); prepare_data(); { boost::lock_guard<boost::mutex> lock(mut); data_ready=true; } cond.notify_one(); }
在更新共享变量data_ready前,先锁定同一个mutex
但调用notify_one()时,不需要锁定mutex
这个例子用到condition_variable,但也适用于condition_variable_any
condition_variable要求传入的lock是boost::unique_lock<boost::mutex>
而condition_variable_any可以接受任意的锁、互斥量
condition_variable因此会有针对boost::unique_lock<boost::mutex>的优化
condition_variable类
~condition_variable()
前提:所有等待的线程都已经通过notify_one()或notify_all()通知,但不要求对应的wait()或timed_wait()已经返回
void notify_one()
void notify_all()
void wait(boost::unique_lock<boost::mutex>& lock)
前提:
lock由当前线程锁定
如果有线程正在*this上等待,那么所有等待线程在等待中使用的锁的mutex()返回的值,与本次调用的lock->mutex()的值是一样的。
作用:
调用lock.unlock()并阻塞线程。
调用this->notify_one()或this->notify_all()时,线程解除阻塞。
在wait返回前,调用lock.lock()
如果发生异常,也会调用lock.lock(),重新占有锁
template<typename predicate_type> void wait(boost::unique_lock<boost::mutex>& lock, predicate_type pred)
作用:
如同
while(!pred()) { wait(lock); }
condition_variable_any类
template<typename lock_type> void wait(lock_type& lock)