zoukankan      html  css  js  c++  java
  • CountDownLatch: 用于线程同步的计数器

    适用于以下两种情况:

    1. 主线程发起多个子线程,等这些子线程各自都完成一定的任务之后,主线程才继续执行。通常用于主线程等待多个子线程完成初始化。

    2. 多个子线程等待主线程,主线程完成后全部子线程开始执行。

    /******************************************************************** 
    Description : 主线程调用wait进入阻塞状态,等待计数器变为0。
    *********************************************************************/
    CountDownLatch::CountDownLatch(int count)
      : mutex_(),
        condition_(mutex_),
        count_(count)
    {
    }
    
    /******************************************************************** 
    Description : 主线程调用wait进入阻塞状态,等待计数器变为0。
    *********************************************************************/
    void CountDownLatch::wait()
    {
      MutexLockGuard lock(mutex_);
      while (count_ > 0)
      {
        condition_.wait();
      }
    }
    
    /******************************************************************** 
    Description:子线程调用countDown将计数器减一,计数器变为0唤醒所有线程。
    *********************************************************************/
    void CountDownLatch::countDown()
    {
      MutexLockGuard lock(mutex_);
      --count_;
      if (count_ == 0)
      {
        condition_.notifyAll();
      }
    }
    
    int CountDownLatch::getCount() const
    {
      MutexLockGuard lock(mutex_);
      return count_;
    }
    namespace muduo
    {
    
    class CountDownLatch : noncopyable
    {
     public:
    
      explicit CountDownLatch(int count);
    
      void wait();
    
      void countDown();
    
      int getCount() const;
    
     private:
      mutable MutexLock mutex_;
      Condition condition_ GUARDED_BY(mutex_);
      int count_ GUARDED_BY(mutex_);
    };
    
    }  // namespace muduo

     其中有这么个用法,int xxx GUARDED_BY(_);

    //表示count被锁mutex_所保护,在访问count时会检查是否占有_mutex
    //__attribute__
    int count GUARDED_BY(mutex_);

      

  • 相关阅读:
    Django中使用Celery实现异步任务队列
    使用Pyenv + pipenv来管理python版本和虚拟环境
    Django设置DEBUG=False后静态文件无法加载
    翕的来历
    Dubbo:基本原理机制
    数据库事务特性及隔离机制再到spring事务管理
    通过rocketmq思考一下mq的设计取舍
    redis的一些特性
    redis的快速机制与数据类型
    Zookeeper选举算法原理
  • 原文地址:https://www.cnblogs.com/BillowJ/p/13440038.html
Copyright © 2011-2022 走看看