线程池
线程池:通俗一点来说,就是一个有着很多线程的池子,线程数量由线程池的最大线程容量控制。当有需要处理的任务到来时,从线程池中取出一个线程去处理这个任务。
应用场景:有大量的数据处理请求,需要执行流并行或并发处理
若是每次有一个数据请求的到来需要去创建线程去处理,处理完销毁则会产生风险以及一些不必要的消耗:
- 线程如若不限制线程创建的数量,在峰值压力下,线程创建过多,资源耗尽,有程序崩溃的风险。
- 创建一个线程的时间:线程创建+任务处理+线程销毁,如果任务处理的时间占比不高,则说明大量的资源都用于了线程的创建和销毁上,因此线程池用创建好的线程循环处理任务,避免了大量的线程创建和线程销毁的时间成本。
自主创建一个线程池
线程池组成:大量线程(每个线程循环的进行任务处理)+ 任务缓冲处理
线程池中的线程每次从任务队列的队首获取一个任务进行处理,线程间以此循环往复。
几个问题:
- 线程的入口函数都是在线程创建初传入线程的,会导致线程池中的线程进行任务处理的方式单一
- 线程的入口函数都一样,处理流程也就一样,只有单一的处理方式,灵活性太差
解决办法:
若任务队列中的任务,不仅仅是单纯的传入数据,并且包含了任务处理方式(入口函数),这时线程池中的线程只需要根据任务的数据和处理函数对数据进行处理,而不用关心是什么数据该如何处理。
代码:
#include<cstdio>
#include<iostream>
#include<pthread.h>
#include<stdlib.h>
#include<queue>
using namespace std;
typedef void(*handler_t)(int data); //定义一个任务处理函数指针
class Task{
public:
//进行数据的传入,处理函数的传入
void settask(int data,handler_t handler)
{
_data=data;
_handler=handler;
}
//进行任务处理
void Run()
{
_handler(_data);
}
private: