6.base之CountDownLatch实现

闭锁概念

  • 闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态
  • 在闭锁到达结束状态之前,没有任何线程能通过
  • 当到达结束状态时,允许所有的线程通过
  • 当闭锁到达结束状态后,将不会再改变状态,因此将永远保持打开状态
  • 闭锁可以用来确保某些活动直到其他活动都完成后才继续执行

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值