`
yiyeqinghuasoon
  • 浏览: 644491 次
文章分类
社区版块
存档分类
最新评论

自增减线程池

 
阅读更多

工作中接手了一款产品的改造。因为该产品可能使用很多线程,所以产品中使用了线程池。

线程池的一个优点是降低线程创建和销毁的频率;缺点是可能在比较闲的时候还存在一定数量的空闲线程。这个也可以比作现实生活中的武器,对于一款武器,有其攻击的能力和防御的能力。有些设计可能会将攻击力做的很强但是防御力有所折扣,有些可能防御做的很好但是攻击力不足。于是如果将这些设计放在一起可能就很难比较个好坏来,但是可能很容易比较出一个“哪个更适合哪种战场”。

于是,回到我们的产品。这款产品原始的线程池一开始时便创建了上百个休眠线程,可以说火力十足啊。但是我们评估后,我们认为大部分场景这些线程可能一辈子都在睡眠!这样的设计在我们预估的场景中明显是“不适宜”的。于是我接到一个任务就是改造之。让其成为一个根据需求可以自增减的线程池。

对于自增减,这便是种策略,又回到攻击力和防御力的博弈上来。还是那句话:适合的才是好的。可以想象,如果自增减的频率过快,那干嘛使用线程池呢?如果过慢,那么干嘛自增减呢?我们的场景:线程池中的任务的增速不会快,减数可能快。目前我写的demo版中,我初始时建立了10个线程,当空闲线程等于1个时,我就会尝试再新建10个线程,当增加到30个线程时,就不增加线程了,任务会保留在列表中,待有空闲线程时去执行。当空闲线程数大于等于当前线程数一半时,我就会查看如果释放了10个线程,空闲线程是否小于等于我设置的最低空闲线程数,如果是,则不释放,否则就释放。当然这只是大致的逻辑。

在demo中,我使用MFC写了个例子(Console版懒得写了)。其中DICThreadPool.h和DICThreadPool.cpp是线程池的相关实现,DICTaskObject.h中是任务要继承的基类。WorkerThread.h和WorkerThread.cpp是任务的实现,这个代码根据不同的业务改变而改变(你可定制),它中包含的类CWorkerThread要继承DICTaskObject.h中的CDICTaskObject,并实现基类中的几个虚函数。


DICTaskObject.h


WorkerThread.h


这个类的实例一半都是new出来的,但是往往因为时机的问题,只有在相关操作执行后才可以delete掉它。于是线程池便提供了一个功能就是负责delete掉这个实例,要想让线程池去delete,就要调用SetAutoDelete(TRUE)。

线程池创建后,要让线程池去执行这个任务,就可以

剩下的事就交给线程池去做吧。

再说一下线程池模型。

可以看见线程池做的事情还是很简单的。它只是负责保存任务、唤醒线程和新建一批新线程。


线程的职责就是取任务执行任务,并判断是否需要减少线程数(带有一定的管理职责,让管理行为由一些行为触发可能比定时去检测要智能些)。

MFC那个例子


先创建线程池,然后新建任务,我会在屏幕中弹出一些窗口,这些窗口的存在周期由右侧的执行时间来决定。


如果想查看详细信息,可以在debugview中设置过滤:


然后我们可以查看刚才的日志

日志中

是初始创建线程池(最低10个,Create中设置的)

这段是插入一个任务,然后3388号线程负责了这个任务

这段是因为刚开始的10个线程中只剩下1个空闲线程了,等于我们设置的最低空闲线程,于是就会再创建10个线程
这是不断有新任务被插入到任务列表中,而线程池满了的情况。

这是一些任务完成了,空闲线程达到了当前线程一半了,就释放掉10个线程(Create中设置的递变线程数)。

这是在递减到接近最低线程数的场景。

以下是该工程地址

DeInCreaseThreadPool

分享到:
评论

相关推荐

    c++ 线程池 即用版

    用c++ 实现的线程池工程,可直接使用,其中线程数目可根据空闲情况自增减,并且实现线程跟任务无关联。

    C++封装的linux下的线程池

    C++封装的linux下的可动态增减的线程池,总共有三个源文件: main.cpp 为例子程序,ThreadPool.cpp和ThreadPool.h为线程池实现文件,仅供学习交流使用

    完成端口结合线程池类库,源码,实例

    用完成端口方式实现的socket通讯类库,其中包括了线程池对线程的动态增减功能,包括服务器类和客户端类,在服务器程序和客户端程序中都可实例化多个对象,同时开启多个端口,同时建立多个客户端.

    智能线程池

    并行服务端增加智能线程池技术根据需求增减线程数目的demo

    中国移动通信CMPP3.0短消息网关开发接口

    线程池能够根据当前的系统负荷,动态地进行线程数调节,动态地增减线程。 网关完全符合CMPP2.0协议标准。支持各省和全网的所有移动网关,同时兼容亚信,华为,东软,清华深讯,思特奇等所有网关厂商平台。 高度...

    论文研究-GIST特征提取的异构并发流计算实现.pdf

    利用线程池技术提供线程预创建、资源预分配及根据资源消耗情况的线程数量动态增减等方法,提高了CPU对GPU计算资源的调度使用效率。实验结果表明,在保证同等精度的前提下,基于异构计算平台的图像GIST特征提取方法...

    精易官方免费模块v3.60版

    3.增加“音量_设置”“音量_获取”“音量_静音”“音量_增减”“A2W” 感谢 灰灰君 提供参考代码 1.修正 “系统_置音量”为"音量_置声道",修改“系统_取音量”为"音量_取声道" 1.完善“文件_改扩展名”的参数备注 ...

    vc++ 开发实例源码包

    演示了其它控件(全部)阙套到List中并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载...

    精易模块[源码] V5.15

    7、新增“类_线程池1”中的“等待”方法。 8、修复“编码_Utf8到Ansi“分配内存失败BUG,感谢易友【仁鹰】反馈。 9、改善“网页_访问”中最后一个参数(代理地址)为“”符号时无法访问网页,感谢易友【z00544】反馈...

    vc++ 应用源码包_1

    演示了其它控件(全部)阙套到List中并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载...

    vc++ 应用源码包_2

    演示了其它控件(全部)阙套到List中并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载...

    vc++ 应用源码包_6

    演示了其它控件(全部)阙套到List中并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载...

    vc++ 应用源码包_5

    演示了其它控件(全部)阙套到List中并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载...

    vc++ 应用源码包_3

    演示了其它控件(全部)阙套到List中并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载...

Global site tag (gtag.js) - Google Analytics