muduo中的线程池。

ThreadPool.h

// Use of this source code is governed by a BSD-style license
// that can be found in the License file.
//
// Author: Shuo Chen (chenshuo at chenshuo dot com)#ifndef MUDUO_BASE_THREADPOOL_H
#define MUDUO_BASE_THREADPOOL_H#include "muduo/base/Condition.h"
#include "muduo/base/Mutex.h"
#include "muduo/base/Thread.h"
#include "muduo/base/Types.h"#include <deque>
#include <vector>namespace muduo
{class ThreadPool : noncopyable
{public:typedef std::function<void ()> Task;explicit ThreadPool(const string& nameArg = string("ThreadPool"));~ThreadPool();// Must be called before start().void setMaxQueueSize(int maxSize) { maxQueueSize_ = maxSize; }//设置任务队列的最大值void setThreadInitCallback(const Task& cb)//设置线程执行前的回调函数{ threadInitCallback_ = cb; }void start(int numThreads);void stop();const string& name() const{ return name_; }size_t queueSize() const;// Could block if maxQueueSize > 0// There is no move-only version of std::function in C++ as of C++14.// So we don't need to overload a const& and an && versions// as we do in (Bounded)BlockingQueue.// https://stackoverflow.com/a/25408989void run(Task f);private:bool isFull() const REQUIRES(mutex_);//判满void runInThread();//线程池的线程运行函数Task take();//取任务函数mutable MutexLock mutex_;Condition notEmpty_ GUARDED_BY(mutex_);//不空conditionCondition notFull_ GUARDED_BY(mutex_); //未满conditionstring name_;Task threadInitCallback_; //线程执行前的回调函数std::vector<std::unique_ptr<muduo::Thread>> threads_;//存放线程的队列std::deque<Task> queue_ GUARDED_BY(mutex_);//存放任务的队列,Task是function泛型size_t maxQueueSize_;//任务队列大小bool running_;
};}  // namespace muduo#endif  // MUDUO_BASE_THREADPOOL_H

ThreadPool.cc

// Use of this source code is governed by a BSD-style license
// that can be found in the License file.
//
// Author: Shuo Chen (chenshuo at chenshuo dot com)#include "muduo/base/ThreadPool.h"#include "muduo/base/Exception.h"#include <assert.h>
#include <stdio.h>
#include <iostream>using namespace muduo;ThreadPool::ThreadPool(const string& nameArg): mutex_(),notEmpty_(mutex_), //初始化的时候需要把condition和mutex关联起来notFull_(mutex_),name_(nameArg),maxQueueSize_(0),//初始化0running_(false)
{
}ThreadPool::~ThreadPool()
{if (running_)//如果线程池在运行,那就要进行内存处理,在stop()函数中执行{stop();}
}void ThreadPool::start(int numThreads)
{assert(threads_.empty());running_ = true;threads_.reserve(numThreads);//预留reserver个空间for (int i = 0; i < numThreads; ++i){char id[32];//id存储线程idsnprintf(id, sizeof id, "%d", i+1);threads_.emplace_back(new muduo::Thread(std::bind(&ThreadPool::runInThread, this), name_+id));threads_[i]->start();//线程启动}if (numThreads == 0 && threadInitCallback_){threadInitCallback_();}
}void ThreadPool::stop() //释放资源
{{MutexLockGuard lock(mutex_);running_ = false;notEmpty_.notifyAll();}for (auto& thr : threads_){thr->join();//资源回收}
}size_t ThreadPool::queueSize() const  //返回任务队列的大小
{MutexLockGuard lock(mutex_);return queue_.size();
}void ThreadPool::run(Task task)//将任务添加到任务队列
{printf("ThreadPool::run\n");if (threads_.empty()){task();}else{MutexLockGuard lock(mutex_);while (isFull())//判断任务队列是否满{printf("notFull_.wait\n");notFull_.wait();}assert(!isFull());printf("2222\n");queue_.push_back(std::move(task));notEmpty_.notify();//此时任务队列非空}
}ThreadPool::Task ThreadPool::take()//取任务函数
{MutexLockGuard lock(mutex_);// always use a while-loop, due to spurious wakeupwhile (queue_.empty() && running_){notEmpty_.wait();}Task task;if (!queue_.empty()){task = queue_.front();queue_.pop_front();  if (maxQueueSize_ > 0) //取走任务后再判断任务队列的大小{notFull_.notify();}}return task;
}bool ThreadPool::isFull() const
{mutex_.assertLocked();std::cout << "maxQueueSize_" << maxQueueSize_ << "queue_.size()=" <<queue_.size() << std::endl;return maxQueueSize_ > 0 && queue_.size() >= maxQueueSize_;
}void ThreadPool::runInThread()//线程池的线程运行函数
{try{if (threadInitCallback_){threadInitCallback_();}while (running_){Task task(take());if (task){task();}}}catch (const Exception& ex){fprintf(stderr, "exception caught in ThreadPool %s\n", name_.c_str());fprintf(stderr, "reason: %s\n", ex.what());fprintf(stderr, "stack trace: %s\n", ex.stackTrace());abort();}catch (const std::exception& ex){fprintf(stderr, "exception caught in ThreadPool %s\n", name_.c_str());fprintf(stderr, "reason: %s\n", ex.what());abort();}catch (...){fprintf(stderr, "unknown exception caught in ThreadPool %s\n", name_.c_str());throw; // rethrow}
}

muduo之ThreadPool相关推荐

  1. muduo网络库——ThreadPool

    模型 源码分析 1)接口 class ThreadPool : noncopyable {public:typedef std::function<void ()> Task;explic ...

  2. muduo网络库:18---muduo简介之(muduo库的由来、编译安装、目录结构、代码结构、线程模型)

    一.由来 2010年3月陈硕先生写了一篇<学之者生,用之者死--ACE历史与简评>(文章参阅:https://blog.csdn.net/Solstice/article/details/ ...

  3. 16muduo_base库源码分析(七)

    1.ThreadPool类图 2.代码 (1)线程池的数据是固定的 (2)无界缓冲区queue ThreadPool.h // Use of this source code is governed ...

  4. 182-muduo网络库(陈硕)编程

    1.muduo网络库编程 muduo网络库的底层就是epoll加linux的pthread线程库. 所以muduo库只能装在linux环境中. muduo网络库的安装:https://blog.csd ...

  5. 《Linux多线程服务端编程:使用muduo C++网络库》书摘6.6.2节

    6.6.2 常见的并发网络服务程序设计方案 W. Richard Stevens 的<UNIX 网络编程(第2 版)>第27 章"Client-ServerDesign Alte ...

  6. 从零开始自制实现WebServer(五)---- 浅沿芳草鲜花小路静心踱步 拨云见雾终见多线程ThreadPool

    文章目录 全流程实现博客链接 前引 (五)---- 浅沿芳草鲜花小路静心踱步 拨云见雾终见多线程ThreadPool 1.理清头绪 直通主路 抓住重点 2.罗列代码 一回生二回熟 再次起航 1.ech ...

  7. muduo网络库源码复现笔记(十七):什么都不做的EventLoop

    Muduo网络库简介 muduo 是一个基于 Reactor 模式的现代 C++ 网络库,作者陈硕.它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程 ...

  8. 【muduo库】server端流程图

    1. 首先是根据陈硕老师的muduo库手册p11的类图,结合自己的学习所得画的一个更详细的流程,使用IO线程池与计算线程池. (1)计算线程中,task()调用TcpConnection::send( ...

  9. muduo 架构解析

     原文:https://blog.csdn.net/Swartz2015/article/details/56675082 muduo是一个基于Reactor模式的C++网络库.它采用非阻塞I/O模型 ...

最新文章

  1. 为什么 AI 工程师要懂一点架构?
  2. eureka集群 ha_Eureka
  3. 月薪没过20K的程序员要注意了!(文末送书)
  4. ieee39节点系统介绍_太原理工大学 秦文萍,逯瑞鹏等:大规模新能源接入对电气耦合综合能源系统稳定性有何影响?...
  5. 读取bmp格式数据--实践思考
  6. Python 判断语句 if else
  7. WP黑格导航主题BlackCan 焕然一新的UI设计
  8. M1支持Windows arm_新款Macbook air,史上最强M1芯片,能买吗?有哪些注意的
  9. 『自定义View实战』—— 仿ios图标下载view DownloadLoadingView
  10. mysql update case when和where之间的注意事项
  11. 开发者经常用到的75 个功能强大的 jQuery插件和教程汇总(上篇)
  12. 安卓苹果均兼容的移动版CAD看图软件——迅捷CAD看图
  13. hive+hbase学习手册
  14. 如何把word ppt 思维导图这类文件转化为高清晰度的图片(要干货只看粗体黑字)...
  15. c++基础 STL 第 0 篇:(模板)
  16. head标签中meta中IE=edge,chrome=1详解
  17. Java---XML的解析(1)-DOM解析
  18. HTML5酷炫动画集锦
  19. 统计分析用户信息量的工具Flurry的使用
  20. 股票的交易原理是怎样的?

热门文章

  1. 神在夏至祭降下了神谕(oracle)
  2. AOJ 491.扑克牌
  3. Bat 循環執行範例
  4. Java Thread源码分析
  5. Ubuntu怎么用c/c++编程
  6. 32位处理器的寄存器介绍
  7. 单位四元数(unit quaternion)
  8. 面试题: mysql 数据库已看 sql安全性 索引 引擎 sql优化
  9. Java 容器学习之 HashMap
  10. vue2.0中引入wangEditor2 步骤与坑