
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线程用于执行任务。
如何获取当前线程池中线程的总个数?
int GetTotalThreadSize() { return this->worker_threads_.size(); }
如何获取当前线程池中空闲线程的个数?
waiting_thread_num_值表示空闲线程的个数,该变量在线程循环内部会更新。
int GetWaitingThreadSize() { return this->waiting_thread_num_.load(); }
简单的测试代码
完整代码
完整代码可在github中查看。https://github.com/fightingwangzq/wzq_utils/blob/master/thread/include/thread/thread_pool.h
