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

本文介绍了如何使用C++11特性构建一个可复用的线程池OEasyPool,包括任务抽象基类、任务队列和线程池的实现。通过实例演示了线程池的配置、使用和扩展,并探讨了C++11的智能指针、原子类型、无序Map和线程等新特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

C++之父说,C++11是一门新的语言。关于 C++11 特性想必大家早已经听说过他的强大。我一直秉性着应用见真知的原则。今天我们使用线程池,来学习部分 C++11 特性。C++11已经基本普及,来吧,我已经迫不及待了。

版权所有:_ OE _, 转载请注明出处:http://blog.youkuaiyun.com/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 = 
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值