泛型编程是指多种数据类型都可以操作,与模板相似,是指一种编程思想,使用模板来实现
模板:是对函数框架功能的描述,具体执行时,根据传递参数决定功能。
stl(standard template library)是标准库的子集
1.使用场景
并发的线程数量很多,频繁的创建线程和销毁会消耗时间。
而线程池维护着多个线程,等待管理者分配可并行执行的任务。这样避免了在短时间内创建和销毁线程的代价。
只要有并发的地方、任务数量大或小、每个任务执行时间长或短的都可以使用线程池;
只不过在使用线程池的时候,注意一下设置合理的线程池大小即可;
分为三部分:
任务队列(生产者消费者)用于存放没有处理的任务,提供一种缓存机制。、工作线程N个、管理线程1个
线程池是多线程的处理形式,处理过程中将任务添加到队列,然后创建线程后自动启动这些任务
(1) 任务队列(Task Queue):
存储需要处理的任务,由工作者线程来处理这些任务。
①通过线程池提供的API函数,将任务添加到任务队列或者从任务队列中删除任务。
②已处理的任务会从任务队列中删除。
③线程池的使用者,也就是往任务队列中添加任务的线程就是生产者线程。
(2) 工作者线程(任务队列任务的消费者,N个)
①线程池中维护了一定数量的工作者线程,他们的任务是不断的读取任务队列中的任务,并且取出执行。
②工作的线程相当于任务的消费者角色。
③如果任务队列为空,工作者线程会被阻塞。(使用条件变量/信号量阻塞)
④一旦任务队列有任务了,由生产者将任务队列解除,工作者线程开始工作。
(3) 管理者线程
①它的任务是周期性的对任务队列中的任务数量以及处于忙状态的工作者线程个数进行检测。
②当任务数量过多时,可以适当的创建一些新的工作线程。
②当任务过少时,可以适当的销毁一些工作的线程。
QThreadPool 看作是对 C++ 实现线程的一种封装。QThreadPool 提供了一套高级接口来管理线程池,包括线程的创建、调度、任务管理等功能。
不需要在qt创建线程池对象,直接使用qt为每个程序提供的线程池全局对象即可。得到对象之后,调用start()方法可以将任务添加到线程池对象中,比自己创建多线程这种方式更容易维护。
把需要添加的任务封装成QRunnable类型,创建子类继承QRunnable类,重写run函数,
QThreadPool::globalInstance()->setMaxThreadCount(10);
QThreadPool::globalInstance()->start(QRunnable *runnable, int priority = 0);