Linux| |线程池

线程池


# 概念

线程池就是一个拥有着许多的线程,可以当任务来临的时候直接让这些线对任务进行处理,而不需要这个时候在创建线程。

所以线程池中的线程是提前创建好的

# 作用

线程池可以增加效率,在处理任务的时候不需要浪费CPU创建线程的时间,所以可以增加效率

# 为什么要有线程池

  • 创建/销毁线程会伴随着系统开销,过于频繁的创建/销毁线程会很大程度上的影响效率

  • 线程并发数量过多,抢占系统资源造成堵塞

  • 对线程进行一些简单的管理

    • 例如:延迟执行,定时循环执行

# 四种线程池

可缓存的线程池

  • 线程数没有限制

  • 有空闲的线程,则使用空闲的线程;没用空闲线程则创建新的线程

  • 一定程度减少频繁创建/销毁线程

定长线程池

  • 可控制线程最大的并发数

  • 超出线程数的线程会在任务队列中等待

周期性执行任务的线程池

也是定长的线程池,只不过可以周期性的执行任务

单线程化的线程池

  • 有且只有一个线程执行任务

  • 所有任务按照指定顺序执行,也就是遵循队列的入队出队的顺序

# 书写一个线程池

  • 采用C++书写一个线程池

首先书写一个线程池要有这两个类:一个是任务类,还有一个是线程池的类

任务类

  • 成员变量

    • 执行该任务所需要的参数

例如:如果该任务是执行加减乘除的运算

  • 那么需要的参数就有

  • 操作数1,操作数2,结果,以及一个函数指针(用来告诉需要调用那个函数,从而挑选是要进行加减乘除的哪一个)

  • 成员函数

    • 构造函数

      • 完成对于一个任务所需要的参数进行初始化

    • 析构函数

      • 进行一些清理工作

    • run函数

      • 执行任务的函数,调用函数指针

线程池类

  • 成员变量

    • 任务队列

      • 用来存放要被线程池执行的任务

    • 线程数

      • 该线程池中拥有多少个线程

    • 判断状态

      • 用来决定是否要退出线程池

    • 互斥锁

      • 完成对临界资源的保护

    • 条件变量

      • 用于实现任务与线程池中的线程的同步的问题

  • 成员函数

    • Hander函数

      • 执行任务的函数,用于对于任务队列中的任务进行处理

    • lock函数

      • 完成加锁操作

    • unlock函数

      • 完成解锁操作

    • noticeOneThread函数

      • 唤醒该条件变量下的某一个线程

      • 为了执行任务队列中的任务

    • noticeAllThread函数

      • 唤醒该条件变量下的所有进程

      • 为了退出该线程池,从而唤醒所有的进程,让每一个进程都退出

    • AddTask函数

      • 向任务队列中增加任务

      • 判断退出状态,如果_isStop为真的话,那么就不在向任务队列中增加任务了

    • GetTask函数

      • 从任务队列中提取任务,从而将任务交给线程来做

    • IdleThread函数

      • 让线程进入等待状态,等待任务的添加

      • 判断退出状态,如果_isStop为真的话,那么就将线程都退出

    • IsEmpty函数

      • 判断任务队列中的任务数是否为空

    • Stop函数

      • 退出线程池,也就是将退出状态设置为空

    • InitThread函数

      • 完成对于线程池的初始化,也就是创建ThraedNums个线程

最后再附上自己写的代码:(保存于github)

https://github.com/YKitty/LinuxDir/tree/master/LinuxCode/pthread/cpAndThreadPool/threadPool 

下面是线程池的总结,以便快速复习和了解线程池:

猜你喜欢

转载自blog.csdn.net/qq_40399012/article/details/85987536