引言
C++之父说,C++11是一门新的语言。关于 C++11 特性想必大家早已经听说过他的强大。我一直秉性着应用见真知的原则。今天我们使用线程池,来学习部分 C++11 特性。C++11已经基本普及,来吧,我已经迫不及待了。
版权所有:_ OE _, 转载请注明出处:http://blog.csdn.net/csnd_ayo
简介
操作系统:windows 7
编程环境:VS2013
最后编辑:2017年6月13日
涉及内容
智能指针
原子类型
无序Map
线程
条件变量
锁机制
2017年6月13日
- 优化 OETaskQueue 成模板型
线程池的由来
养鱼的大雄
机器猫每次看着大雄买鱼回家,还都是带着一只鱼缸,大雄跟我机器猫讲解,是因为一只鱼缸里只能装一只鱼,家里没有多余的鱼缸了。
机器猫骂骂咧咧的说 “你每天晚上搞什么鬼,在那里不停的砸鱼缸,啪啪啪的,吓坏宝宝了。”
大雄温声细语的讲解到:“这样还不是为了节省空间,让哆啦a梦你有更多的地方可以蹦跶呀。”
“大雄,一看你就是个傻逼,我们的房子有2048平方米,鱼缸往大了算才0.4平米不到,你节省个毛线啊。你每天晚上在那里砸鱼缸就算了,第二天又买了个新的鱼缸回来是什么鬼!天天买,天天砸,你你你,你搞事情啊!!”哆啦a梦又骂骂咧咧的讲道。
大雄在使劲的拍了下自己的脑袋,发现真的是那么一回事儿,但是内心小懒虫又耐不住寂寞。
“可是鱼缸不好管理,我鱼买的多的时候,要加鱼缸,鱼买的少了的时候,又得把鱼缸丢掉。” 大雄支支吾吾的嘀咕着。买鱼缸的时候,还得想家里鱼缸足不足够。丢鱼缸的时候还要想明天会不会买鱼。
“关键的时候还得靠我,你就只会偷懒。” 机器猫带着一点点嫌弃的口吻讲道。
自豪的掏出了宝物:”自动鱼池~”
他是一个自动控制大小的鱼池,他会根据鱼的数量来决定鱼池的大小,你可以设置鱼池的最大大小和最小大小,若鱼太多的时候,它就会等其它的鱼死了,再把新的鱼放入鱼池。他还有很多功能呢。
大雄的线程池
原来线程池是这么来的,我也很惊讶。是大雄的愚蠢,才让我们见识到这么厉害的宝贝。
有人说,大雄拿到的明明是自动鱼池,我们的是线程池,压根是两个东西。
其实,这也多亏了大雄,因为大雄最近也在学编程。
至于大雄学编程的故事,我们下回再讲。^_^.
大雄不甘寂寞写了一份线程池分享给大家 [点击免费下载]
结语
线程池是为了避免创建和回收,以减少不必要的资源开销,维护特定的线程资源,在需要的时候使用,不需要的时候等待需要,长时间处于闲置的线程,则主动释放。这样的运行机制,在请求频繁的系统中广为应用。更高级的用法还有多线程池的方法。
使用介绍
接下来,我将以逻辑顺序的方式讲解线程池的制作过程。(逻辑方式便于理解)若没有源码的朋友,可以翻到上面,下载源码后,跟着文章一起阅读。
类的功能
Task (任务基类)
该类主要实现一个任务类
virtual int doWork() = 0;TaskQueue (任务队列)
该类主要针对任务的存储、删除、撤回等状态做管理
ThreadPool (线程池)
整个线程池的核心业务处理类
Main函数
我们来讲解第一个示例Demo test_base
ThreadPoolDemo.cpp
#include <time.h> #include <iostream> #include <memory> #include "ThreadPool.h" #include "../test/TaskTest.h" using namespace std; int main(void) { OEThreadPool::ThreadPoolConfig threadPoolConfig; threadPoolConfig.nMaxThreadsNum = 100; threadPoolConfig.nMinThreadsNum = 5; threadPoolConfig.dbTaskAddThreadRate = 3; threadPoolConfig.dbTaskSubThreadRate = 0.5; clock_t start = clock(); { std::shared_ptr<OEThreadPool> threadPool(new OEThreadPool); threadPool->init(threadPoolConfig); int nID = 0; while (true) { std::shared_ptr<OETaskTest> request =