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