工作中接手了一款产品的改造。因为该产品可能使用很多线程,所以产品中使用了线程池。
线程池的一个优点是降低线程创建和销毁的频率;缺点是可能在比较闲的时候还存在一定数量的空闲线程。这个也可以比作现实生活中的武器,对于一款武器,有其攻击的能力和防御的能力。有些设计可能会将攻击力做的很强但是防御力有所折扣,有些可能防御做的很好但是攻击力不足。于是如果将这些设计放在一起可能就很难比较个好坏来,但是可能很容易比较出一个“哪个更适合哪种战场”。
于是,回到我们的产品。这款产品原始的线程池一开始时便创建了上百个休眠线程,可以说火力十足啊。但是我们评估后,我们认为大部分场景这些线程可能一辈子都在睡眠!这样的设计在我们预估的场景中明显是“不适宜”的。于是我接到一个任务就是改造之。让其成为一个根据需求可以自增减的线程池。
对于自增减,这便是种策略,又回到攻击力和防御力的博弈上来。还是那句话:适合的才是好的。可以想象,如果自增减的频率过快,那干嘛使用线程池呢?如果过慢,那么干嘛自增减呢?我们的场景:线程池中的任务的增速不会快,减数可能快。目前我写的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++封装的linux下的可动态增减的线程池,总共有三个源文件: main.cpp 为例子程序,ThreadPool.cpp和ThreadPool.h为线程池实现文件,仅供学习交流使用
用完成端口方式实现的socket通讯类库,其中包括了线程池对线程的动态增减功能,包括服务器类和客户端类,在服务器程序和客户端程序中都可实例化多个对象,同时开启多个端口,同时建立多个客户端.
并行服务端增加智能线程池技术根据需求增减线程数目的demo
线程池能够根据当前的系统负荷,动态地进行线程数调节,动态地增减线程。 网关完全符合CMPP2.0协议标准。支持各省和全网的所有移动网关,同时兼容亚信,华为,东软,清华深讯,思特奇等所有网关厂商平台。 高度...
利用线程池技术提供线程预创建、资源预分配及根据资源消耗情况的线程数量动态增减等方法,提高了CPU对GPU计算资源的调度使用效率。实验结果表明,在保证同等精度的前提下,基于异构计算平台的图像GIST特征提取方法...
3.增加“音量_设置”“音量_获取”“音量_静音”“音量_增减”“A2W” 感谢 灰灰君 提供参考代码 1.修正 “系统_置音量”为"音量_置声道",修改“系统_取音量”为"音量_取声道" 1.完善“文件_改扩展名”的参数备注 ...
演示了其它控件(全部)阙套到List中并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载...
7、新增“类_线程池1”中的“等待”方法。 8、修复“编码_Utf8到Ansi“分配内存失败BUG,感谢易友【仁鹰】反馈。 9、改善“网页_访问”中最后一个参数(代理地址)为“”符号时无法访问网页,感谢易友【z00544】反馈...
演示了其它控件(全部)阙套到List中并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载...
演示了其它控件(全部)阙套到List中并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载...
演示了其它控件(全部)阙套到List中并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载...
演示了其它控件(全部)阙套到List中并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载...
演示了其它控件(全部)阙套到List中并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载...