boost-同步-条件变量

概要


 

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)

 

posted on 2016-03-07 15:07  神气小宇  阅读(1657)  评论(0编辑  收藏  举报

导航