C++11 编写可复用多线程任务池 (开源OEasyPool)

引言

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日

    1. 优化 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 = 
  • 17
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: C++ Boost是一个广泛使用的开源集合,为C++提供了许多功能强大的工具和算法。在Boost中,有一个名为C++11 Boost的子模块,它专门为支持C++11标准而设计。 C++11标准引入了许多新的语言特性和组件,以提高编程效率和代码可靠性。而C++11 Boost则扩展了标准,为开发者提供了更多的功能和工具。 C++11 Boost的中文手册是为了方便中国程序员使用该编写的文档。该手册详细介绍了C++11 Boost中各个模块的功能、用法和示例代码。通过阅读中文手册,程序员可以更清晰地了解每个模块的用途,以及如何正确地使用它们。 在C++11 Boost中,有许多常用的模块,比如smart_ptr模块,提供了智能指针的功能,用于管理动态内存;thread模块,用于创建和管理线程;filesystem模块,提供了对文件和目录的操作等。在中文手册中,为每个模块都提供了详细的说明和示例,帮助开发者快速上手和运用。 总之,C++11 Boost中的中文手册为中国的程序员提供了方便和便捷的学习和使用Boost的途径。通过阅读手册,开发者可以更加深入地了解每个模块的使用方法,从而更高效地开发和调试他们的C++程序。 ### 回答2: Boost是一个C++开源集合,提供了丰富的功能和工具,可以帮助开发者更加高效地进行C++编程。Boost中文手册是对Boost的相关文档进行中文翻译的版本。 Boost包含了众多的模块和组件,如智能指针、函数对象、线程、正则表达式、文件系统等,覆盖了C++开发中常用的领域。通过使用Boost,开发者可以在项目中集成各种功能强大、稳定可靠的组件,提高代码的复用性和可维护性。 Boost中文手册对于理解和学习Boost的使用非常有帮助。手册中提供了详细的说明和示例代码,对于各个组件的功能、用法和特性进行了清晰的介绍,使得开发者可以快速上手和了解各个组件的使用细节。 通过学习Boost中文手册,开发者可以深入了解各个模块和组件的详细功能和使用方法,使得他们能够更加灵活地利用Boost来解决实际的开发问题。同时,手册中也提供了相应的参考资料和链接,方便开发者进一步扩展他们的学习和实践。 总之,Boost中文手册是一个非常宝贵的资源,可以帮助开发者更好地利用Boost进行C++编程。通过掌握Boost提供的丰富功能和工具,开发者可以在项目中提高代码的效率和质量,同时也能够更好地满足对于C++编程的需求。 ### 回答3: Boost是一个开源C++,提供了很多功能丰富的组件,可以帮助开发者更轻松地进行C++程序开发。Boost中包含了很多不同的模块,涵盖了各种不同的领域和功能。 11-boost中文手册是指Boost的第11章,该章节主要介绍了一些与字符串处理相关的功能组件。在这个章节中,我们可以了解到Boost提供了一些强大的字符串处理工具,可以用于字符串的分割、合并、格式化、替换等操作。 例如,Boost中的split函数可以帮助我们将一个字符串按照指定的分隔符进行分割,并将分割后的子字符串存入一个容器中。另外,Boost还提供了format函数,用于格式化字符串,能够方便地将变量插入到字符串中。 此外,Boost还提供了一些用于字符串匹配和替换的函数,例如regex_match和regex_replace等。这些函数可以帮助开发者高效地进行字符串模式匹配和替换。 总之,11-boost中文手册是关于Boost中字符串处理的部分。通过使用Boost中提供的强大函数和组件,开发者可以更加方便地进行字符串处理和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值