C++ 线程池的实现
本人在开发过程中经常会遇到需要使用线程池的需求,但查了一圈发现在C++中完备的线程池第三方库还是比较少的,于是打算自己搞一个,链接地址文章最后附上,目前还只是初版,可能还有很多问题,望各位指正。
线程池都需要什么功能?
个人认为线程池需要支持以下几个基本功能
核心线程数(core_threads):线程池中拥有的最少线程个数,初始化时就会创建好的线程,常驻于线程池。
最大线程个数(max_threads):线程池中拥有的最大线程个数,max_threads>=core_threads,当任务的个数太多线程池执行不过来时,内部就会创建更多的线程用于执行更多的任务,内部线程数不会超过max_threads,多创建出来的线程在一段时间内没有执行任务则会自动被回收掉,最终线程个数保持在核心线程数。
超时时间(time_out):如上所述,多创建出来的线程在time_out时间内没有执行任务就会被回收。
可获取当前线程池中线程的总个数。
可获取当前线程池中空闲线程的个数。
开启线程池功能的开关。
关闭线程池功能的开关,可以选择是否立即关闭,立即关闭线程池时,当前线程池里缓存的任务不会被执行。
如何实现线程池?
下面是自己实现的线程池逻辑
线程池中主要的数据结构
链表或者数组:用于存储线程池中的线程。
队列:用于存储需要放入线程池中执行的任务。
条件变量:当有任务需要执行时,用于通知正在等待的线程从任务队列中取出任务执行。代码如下:
线程池的初始化
在构造函数中将各个成员变量都附初值,同时判断线程池的config是否合法。
如何开启线程池功能?
创建核心线程数个线程,常驻于线程池,等待任务的执行,线程ID由GetNextThreadId()统一分配。
如何关闭线程?
这里有两个标志位,is_shutdown_now置为true表示立即关闭线程,is_shutdown置为true则表示先执行完队列里的任务再关闭线程池。
如何为线程池添加线程?
见AddThread()函数,默认会创建Core线程,也可以选择创建Cache线程,线程内部会有一个死循环,不停的等待任务,有任务到来时就会执行,同时内部会判断是否是Cache线程,如果是Cache线程,time_out时间内没有任务执行就会自动退出循环,线程结束。这里还会检查is_shutdown和is_shutdown_now标志,根据两个标志位是否为true来判断是否结束线程。
如何将任务放入线程池中执行?
见如下代码,将任务使用std::bind封装成std::function放入任务队列中,任务较多时内部还会判断是否有空闲线程,如果没有空闲线程,会自动创建出最多(max_threads-core_threads)个Cache线程用于执行任务。
如何获取当前线程池中线程的总个数?
如何获取当前线程池中空闲线程的个数?
waiting_thread_num_值表示空闲线程的个数,该变量在线程循环内部会更新。
简单的测试代码
未完待续
关于线程池个人认为还应该有定时器功能和循环执行某个任务的功能,这两个功能我是单独封装成一个类实现,可以参考https://www.jianshu.com/p/6bc3a3bcef56。
完整代码
完整代码可在github中查看。https://github.com/fightingwangzq/wzq_utils/blob/master/thread/include/thread/thread_pool.h
版权声明: 本文为 InfoQ 作者【this_is_for_u】的原创文章。
原文链接:【http://xie.infoq.cn/article/9ebcf18ea36b92f743c0bd848】。文章转载请联系作者。
评论