6.base之CountDownLatch實現
阿新 • • 發佈:2021-01-07
技術標籤:從輪子造起——一個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