zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    Head First 设计模式笔记(第十章 状态模式 & 第十一章 代理模式)
    Head First 设计模式笔记(第八章 模板方法模式 & 第九章 适配器模式)
    Head First 设计模式笔记(第六章 命令模式 & 第七章 适配器模式)
    Head First 设计模式笔记(第四章 工厂模式 & 第五章 单例模式)
    Head First 设计模式笔记(第二章 观察者模式 & 第三章 装饰者模式)
    Head First 设计模式笔记(第一章 设计模式入门)
    高性能MySQL笔记(第十二章 高可用性)
    CF 1514B AND 0, Sum Big
    Dijkstra【模板】【邻接表+优先队列】
    快速幂+矩阵快速幂【模板】
  • 原文地址:https://www.cnblogs.com/sqxy110/p/5250652.html
Copyright © 2011-2022 走看看