1,线程池是什么?
在计算机编程中,线程池是一种在计算机程序中实现并发执行的软件设计模式。线程池通常也称为复制工作者或工作者-团队模式,它维护多个线程,等待分配任务,由监督程序并发执行。
------维基百科
下列是线程池的原理示意图:(来源:GitHub - mtrebi/thread-pool: Thread pool implementation using c++11 threads)
线程池有两个核心的概念,一个是任务队列,一个是工作线程队列。任务队列负责存放主线程需要处理的任务,工作线程队列其实是一个死循环,负责从任务队列中取出和运行任务,可以看成是一个生产者和多个消费者的模型。
一般的流程是,提交一项任务后,线程池分配线程在不阻塞主线程的情况下完成这项工作。并且,线程池并不是每提交一项任务初始化一次,而是一次初始化,保持非活跃状态直至一些任务完成。这样的话,也减小了系统开销。
2,什么情况下需要用到线程池?
有这样一个项目:公司需要为某某超市做一套对每天进入超市的顾客做用户画像的系统。基本流程是:对摄像头拍摄到的每一帧画面做人脸检测,然后对每个人脸进行年龄、性别和特征点的计算,最后将结果 post 到服务端进行后续处理。大家都知道人脸相关算法耗时是较高的,如果所有计算任务都放在主线程进行,那么势必会阻塞主线程的处理流程,无法做到实时处理。使用多线程技术是大家自然而然想到的方案,对每一帧都创建一个新的线程来做这系列的处理是否合理呢?相信大家都知道,线程的创建和销毁都是需要时间的,在上述的场景中必然会频繁的创建和销毁线程,这样的开销相信是不能接受的,此时线程池技术便是很好的选择。
另外,在一些高并发的网络应用中,线程池也是常用的技术。陈硕大神推荐的C++多线程服务端编程模式为:one loop per thread + thread pool,通常会有单独的线程负责接受来自客户端的请求,对请求稍作解析后将数据处理的任务提交到专门的计算线程池。
3 ,如何实现一个简易的线程池
给出一个类图