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

  

原文地址:https://www.cnblogs.com/BillowJ/p/13440038.html