线程池:一个或多个线程+任务队列;
为什么要有线程池:一个程序起来以后立即启动了很多线程然后取处理任务,如果每来
一个请求都创建一个线程线程占资源,如果一瞬间来了很多请求会把资源耗尽程序奔溃了
应用场景:(1)启动线程处理任务请求,若同一时间因为大量请求创建大量线程有可能导致资源耗尽程序奔溃(需要限制上限)(2)创建线程(t1)+t2(处理任务时间)+t3销毁线程=总花费时间t
t1+t3/t线程创建销毁占的时间比例,如果占的时间比例特别高,大量时间用于创建线程销毁cpu利用率低,解决方法:一开始就创建一堆线程一直不退出,让他们去处理请求
功能:(1)避免峰值压力导致资源耗尽(2)避免大量线程的创建/销毁成本
任务队列:缓冲区,任务交给线程,
如何实现:线程创建和线程安全的任务队列实现+向队列添加任务
线程会从任务队列拿取数据,所以这个任务队列要保证线程安全
C++中stl容器:std::queue实现
成员:std:queue _list任务队列
_cap数量上限
mutex保证安全
Fcond队列为满
Empty队列为空
大量的线程线程的个数intmax_thr最大线程数量
自适应线程:一开始不创建线程,有任务来了查看现在有么有空闲的线程,如果没有创建线程,但是有最大数量上限,如果这些线程在一定的时间段内一直得不到任务(特别闲)为了省资源会让这些线程满满逐一退出,暂时省下资源了
直接创建固定线程:
成员函数里面:queuepush queuepop addtask(添加任务)
创建线程池的时候这些线程的入口函数一样(内部逻辑一样意味着他们只能处理相同的任务代表 一类线程池只能处理一类任务如果任务种类比较多久难以实现了),
Eg:线程处理文本图片和语言,处理方式稍微有不同,入口函数不同,从一个任务队列拿数据可能出错如何解决?
为了通用性着想处理不同请求:不应该直接放在线程的入口函数里面去处理也就是任务的处理方法由任务的本身决定
所以还需
linux线程池的实现-线程的单例模式(懒汉饿汉模式)
最新推荐文章于 2023-05-10 13:46:46 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)