Go-Hub-l / ThreadPool

简易线程池,包含消费者线程,管理者线程 线程根据任务数自动增长减少

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

线程池

消费者线程

1 消费者线程统一到ThreadFunc函数中执行,初始时消费者线程判断任务队列为空,会挂起在条件变量上。
2 消费者线程被唤醒后,首先检查退出码,判断是否需要退出,如果需要退出的就主动解锁并退出
    之所以消费者线程自动退出的目的是,不让管理者线程承担过多的工作,管理者线程应该只是负责统一的管理,
    即管理者线程设置线程退出码,之后的退出工作完全由消费者线程自己完成。

3 消费者线程只是取任务,执行任务,无任务挂起

管理者线程

1 管理者线程需要做两件事:
    1.1 当任务数比较多时,能够合理的增加线程数
    1.2 当任务数比较少时,能够合理的减少线程数

2 增加线程数
    2.1 管理者增加消费者的线程通过忙碌线程数和当前创建的线程数的占比来确定,并且线程数的总数不能超过最大线程数
    2.2 此设计的线程池的占比设计为70%,即当忙碌线程数大于等于创建线程数的70%时,就会一次增加10个线程(占比需要合理设计,这里的70只是粗略的设计)

3 减少线程数
    3.1 管理者减少消费者的线程数同样通过忙碌线程数和当前创建的线程数来确定,并且线程数最小不能小于最小线程数
    3.2 此设计的线程池较少条件为空闲线程数大于等于忙碌线程数的两倍,
        则每次退出10个(管理者线程只是设置线程退出码,唤醒消费者线程,实际上是消费者线程自己结束)
        (同样,线程数的退出条件也应该合理设计,这里只是粗略设计)

改进

本线程池只是简单的实现,还有很多需要改进的地方。
  • 锁的设计:细粒度锁代替粗粒度锁,提高并发性(此线程池的任务添加,消费者取任务,管理者管理任务都是用的一把锁)
  • 增加线程数的条件
  • 退出线程数的条件

About

简易线程池,包含消费者线程,管理者线程 线程根据任务数自动增长减少


Languages

Language:C++ 100.0%