您的位置:首页 > 其它

boost-同步-条件变量

2016-03-07 15:07 316 查看
概要

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: