线程池

发布时间 2023-08-26 23:12:58作者: 悲伤鳄鱼吃面包

什么是线程池

一般来说,我们使用一个线程的时候就去创建一个线程,当执行完任务后就将线程销毁。如果并发的线程很多,频繁的创建和销毁线程会降低效率。
为了实现线程的复用,即执行完一个任务后不被销毁,继续执行其他任务,我们就可以创建一个线程池。
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。


每个线程就类似于浏览器中新开了一个标签页,后台执行任务

线程池的组成

任务以及任务队列

任务

封装了一个结构体,包含任务的处理函数以及函数需要的参数

struct Task
{
	//回调函数,说明如何处理任务
	void* function(void* arg);
	//回调函数需要的参数,如果需要多个参数,那么就封装成一个结构体,传入这个结构体
	void* arg;
};

任务队列

封装了一个类,类中封装了一个队列储存Task,同时封装了一些相关的函数:往队列中添加任务、取出任务、获取队列中任务个数。并且因为很多线程都要从队列中取出任务,我们不希望多个线程同时操作任务队列,所以还要封装一把互斥锁进去

管理者线程

管理者线程只有一个
定时查看线程池中工作线程的情况,如果空闲的工作线程太多,就销毁一些工作线程,如果任务数量比工作线程数量多,就添加一些工作线程。
依据manager函数行动

工作线程

工作线程有多个
负责从任务队列中取出Task
依据worker函数行动