muduo之ThreadPool
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相关推荐
- muduo网络库——ThreadPool
模型 源码分析 1)接口 class ThreadPool : noncopyable {public:typedef std::function<void ()> Task;explic ...
- muduo网络库:18---muduo简介之(muduo库的由来、编译安装、目录结构、代码结构、线程模型)
一.由来 2010年3月陈硕先生写了一篇<学之者生,用之者死--ACE历史与简评>(文章参阅:https://blog.csdn.net/Solstice/article/details/ ...
- 16muduo_base库源码分析(七)
1.ThreadPool类图 2.代码 (1)线程池的数据是固定的 (2)无界缓冲区queue ThreadPool.h // Use of this source code is governed ...
- 182-muduo网络库(陈硕)编程
1.muduo网络库编程 muduo网络库的底层就是epoll加linux的pthread线程库. 所以muduo库只能装在linux环境中. muduo网络库的安装:https://blog.csd ...
- 《Linux多线程服务端编程:使用muduo C++网络库》书摘6.6.2节
6.6.2 常见的并发网络服务程序设计方案 W. Richard Stevens 的<UNIX 网络编程(第2 版)>第27 章"Client-ServerDesign Alte ...
- 从零开始自制实现WebServer(五)---- 浅沿芳草鲜花小路静心踱步 拨云见雾终见多线程ThreadPool
文章目录 全流程实现博客链接 前引 (五)---- 浅沿芳草鲜花小路静心踱步 拨云见雾终见多线程ThreadPool 1.理清头绪 直通主路 抓住重点 2.罗列代码 一回生二回熟 再次起航 1.ech ...
- muduo网络库源码复现笔记(十七):什么都不做的EventLoop
Muduo网络库简介 muduo 是一个基于 Reactor 模式的现代 C++ 网络库,作者陈硕.它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程 ...
- 【muduo库】server端流程图
1. 首先是根据陈硕老师的muduo库手册p11的类图,结合自己的学习所得画的一个更详细的流程,使用IO线程池与计算线程池. (1)计算线程中,task()调用TcpConnection::send( ...
- muduo 架构解析
原文:https://blog.csdn.net/Swartz2015/article/details/56675082 muduo是一个基于Reactor模式的C++网络库.它采用非阻塞I/O模型 ...
最新文章
- 为什么 AI 工程师要懂一点架构?
- eureka集群 ha_Eureka
- 月薪没过20K的程序员要注意了!(文末送书)
- ieee39节点系统介绍_太原理工大学 秦文萍,逯瑞鹏等:大规模新能源接入对电气耦合综合能源系统稳定性有何影响?...
- 读取bmp格式数据--实践思考
- Python 判断语句 if else
- WP黑格导航主题BlackCan 焕然一新的UI设计
- M1支持Windows arm_新款Macbook air,史上最强M1芯片,能买吗?有哪些注意的
- 『自定义View实战』—— 仿ios图标下载view DownloadLoadingView
- mysql update case when和where之间的注意事项
- 开发者经常用到的75 个功能强大的 jQuery插件和教程汇总(上篇)
- 安卓苹果均兼容的移动版CAD看图软件——迅捷CAD看图
- hive+hbase学习手册
- 如何把word ppt 思维导图这类文件转化为高清晰度的图片(要干货只看粗体黑字)...
- c++基础 STL 第 0 篇:(模板)
- head标签中meta中IE=edge,chrome=1详解
- Java---XML的解析(1)-DOM解析
- HTML5酷炫动画集锦
- 统计分析用户信息量的工具Flurry的使用
- 股票的交易原理是怎样的?