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_);

      

  • 相关阅读:
    Kubernetes组件及网络基础
    mybatis小结-001
    mysql+navicat安装小结
    ibatsi学习总结
    linux 相关的问题
    java 基础 --int 和Integer的区别
    java 接口和抽象类的区别
    java 堆和栈的区别
    springMVC controller配置方式总结
    GC是什么?为什么要有GC
  • 原文地址:https://www.cnblogs.com/BillowJ/p/13440038.html
Copyright © 2011-2022 走看看