线程池是一种通过空间换时间提高程序性能的技术。
总体流程为
调用者->线程池->任务队列->通知worker线程
worker线程->任务队列取任务->执行任务

其实整套机制可以视作生产者-消费者模型,调用者生产任务,worker线程消费任务。其中用到的同步机制有互斥锁、条件变量。互斥锁的粒度为一个任务队列用一把锁,加入任务或取出任务时需要加锁。条件变量是为了实现生产行为与消费行为的同步,在生产任务之后通知到worker线程。

一个标准的线程池类:
线程组threads
任务队列tasks
任务队列互斥锁mutex
条件变量condition_variable
线程数thread_num
运行标志is_stop

扩展:

  1. 线程池自适应:如果在运行过程中线程用完了,动态创建线程
  2. C++11标准中,有std::thread、std::mutex、std::condition_variable而11之前的标准则需要与具体系统API挂钩。linux中有pthread_t mutex_t condition_variable_t
  3. 无参任务较容易实现。如果需要传入可变参数的任务,可以使用模板template<class F, class… Args>

附一张JAVA中的线程池类流程图
线程池初探
程序员开源交流QQ群 792272915

相关文章: