线程池模型
线程池是并发编程中常用的模型。
线程是一种非常宝贵的资源,创建、销毁线程都是非常消耗时间的操作,所以我们的一个思路是在程序start up的时候,创建一个保存有多个线程的缓存,这样程序运行时就不会频繁的发生创建和销毁线程的操作,从而提高了并发的效率。
保存有多个线程的这个缓存,我们一般称其为线程池(ThreadPool)。如果线程池的中线程的数量可以动态变化,我们称其为动态大小的线程池,这里讨论并实现的是固定大小的线程池
线程池中维护多个线程(thread)的同时,维护一个任务队列。所谓的任务队列,就是需要我们去并发执行的一个个的任务,说的通俗一点,就是等待执行的一个个函数。一旦任务队列不空,取出一个任务给定某个空闲的线程去执行该任务。
这是一个典型的生产者和消费者的模型,所以我们要用到mutex和conditon variable原语。除此之外,我们还应该对“任务”有一个合理的抽象。
所以线程池这个类的数据成员应该有如下几个:
1.mutex_t mutex
2.condition_t cond
3.vector_t<thread_t> threadVec
4.queue_t<task_t> taskQ
其中thread_t在C++11中可以使用std::thread来替代,可是这里的task_t我们还没有定义。
实际上,task_t是对某个执行过程的抽象,所以我们可以用C++11中的function语义来替代:
using task_t = function<void()>
<