1. 程式人生 > 其它 >6.base之CountDownLatch實現

6.base之CountDownLatch實現

技術標籤:從輪子造起——一個muduo庫的實現

閉鎖概念

  • 閉鎖是一種同步工具類,可以延遲執行緒的進度直到其到達終止狀態
  • 在閉鎖到達結束狀態之前,沒有任何執行緒能通過
  • 當到達結束狀態時,允許所有的執行緒通過
  • 當閉鎖到達結束狀態後,將不會再改變狀態,因此將永遠保持開啟狀態
  • 閉鎖可以用來確保某些活動直到其他活動都完成後才繼續執行

CountDownLatch類

作用

CountDownLatch能夠使一個執行緒在等待另外一些執行緒完成各自工作之後,再繼續執行。使用一個計數器進行實現。計數器初始值為執行緒的數量。當每一個執行緒完成自己任務後,計數器的值就會減一。當計數器的值為0時,表示所有的執行緒都已經完成一些任務,然後在CountDownLatch上等待的執行緒就可以恢復執行接下來的任務。

CountDownLatch是一種靈活的閉鎖實現,可以在上述各種情況中使用,它可以使一個或多個執行緒等待一組事件發生。閉鎖狀態包括一個計數器,該計數器被初始化為一個正數,表示需要等待的事件數量。
countDown方法遞減計數器,表示有一個事件已經發生了
wait方法等待計數器達到零,這表示所有需要等待的事件都已經發生
如果計數器的值非零,那麼wait會一直阻塞直到計數器為零,或者等待中的執行緒中斷,或者等待超時。

可以向CountDownLatch物件設定一個初始的數字作為計數值,任何呼叫這個物件上的wait()方法都會阻塞,直到這個計數器的計數值被其他的執行緒減為0為止。

使用countDownLatch,啟動門可以保證主執行緒同時釋放所有工作執行緒而不是先後執行,結束門可以保證主執行緒等待最後一個執行緒執行完成

介面

  • 初始化計數器(建構函式):CountDownLatch(int count)
  • 遞減計數器:countDown()
  • 等待:wait()
  • 獲取當前計數器的值:getCount()

資料

  • 互斥量mutex_
  • 條件變數condition_
  • 計數器count_

程式碼實現

類結構

class CountDownLatch : noncopyable {
public:
      explicit CountDownLatch(int count);
      void wait();
      void countDown();
      int getCount() const;
private:
      mutable MutexLock mutex_;
      Condition condition_;
      int count_;
};

函式實現

//初始化計數器
CountDownLatch::CountDownLatch(int count) 
      : mutex_(), condition_(mutex_), count_(count) { }

//用condition的wait方法等待條件達成
void CountDownLatch::wait() {
      MutexLockGuard lock(mutex_);
      while(count_ > 0) {
            condition_.wait();
      }    
}

//遞減計數器
void CountDownLatch::countDown() {
      MutexLockGuard lock(mutex_);
      --count_;
      if(count_ == 0) {
            condition_.notifyAll();
      }
}

//返回計數器
int CountDownLatch::getCount() const {
      MutexLockGuard lock(mutex_);
      return count_;
}

https://blog.csdn.net/KID_LWC/article/details/98269619
https://blog.csdn.net/zhangxiao93/article/details/72677207