muduo库阅读(36)——Net部分:事件循环线程池EventLoopThreadPool
来源:互联网 发布:淘师湾算法与问题解决 编辑:程序博客网 时间:2024/05/18 03:13
/* * 事件循环线程池 * 这个类适用于一个进程中存在多个Reactor实例的情况 */namespace muduo{namespace net{class EventLoop;class EventLoopThread;class EventLoopThreadPool : boost::noncopyable{public:typedef boost::function<void(EventLoop*)> ThreadInitCallback;EventLoopThreadPool(EventLoop* baseLoop, const string& nameArg);~EventLoopThreadPool();// 设置线程池的线程数量void setThreadNum(int numThreads) { numThreads_ = numThreads; }// 启动线程池void start(const ThreadInitCallback& cb = ThreadInitCallback());// 获取下一个EventLoop对象EventLoop* getNextLoop();// 根据一个哈希码返回一个EventLoop对象EventLoop* getLoopForHash(size_t hashCode);// 获取所有的EventLoop对象std::vector<EventLoop*> getAllLoops();// 判断线程池是否已经启动bool started() const{ return started_; }// 线程池的名字const string& name() const{ return name_; }private://主要的EventLoop对象EventLoop* baseLoop_;// 线程池的名字string name_;// 线程池是否已经启动bool started_;// 线程池中线程的数量int numThreads_;int next_;// 线程列表boost::ptr_vector<EventLoopThread> threads_;// EventLoop对象列表std::vector<EventLoop*> loops_;};}}
using namespace muduo;using namespace muduo::net;/* * 构造函数 */EventLoopThreadPool::EventLoopThreadPool(EventLoop* baseLoop, const string& nameArg): baseLoop_(baseLoop), name_(nameArg), started_(false), numThreads_(0), next_(0){}EventLoopThreadPool::~EventLoopThreadPool(){// Don't delete loop, it's stack variable}// 启动线程池void EventLoopThreadPool::start(const ThreadInitCallback& cb){assert(!started_);baseLoop_->assertInLoopThread();started_ = true;// 创建指定数量的线程,并启动for (int i = 0; i < numThreads_; ++i){char buf[name_.size() + 32];snprintf(buf, sizeof buf, "%s%d", name_.c_str(), i);EventLoopThread* t = new EventLoopThread(cb, buf);threads_.push_back(t);loops_.push_back(t->startLoop());}if (numThreads_ == 0 && cb){cb(baseLoop_);}}// 获取下一个EventLoop对象EventLoop* EventLoopThreadPool::getNextLoop(){baseLoop_->assertInLoopThread();assert(started_);EventLoop* loop = baseLoop_;if (!loops_.empty()){// round-robinloop = loops_[next_];++next_;if (implicit_cast<size_t>(next_) >= loops_.size()){next_ = 0;}}return loop;}// 根据哈希码获取一个EventLoop对象,其实哈希码就是EventLoop数组的下标EventLoop* EventLoopThreadPool::getLoopForHash(size_t hashCode){baseLoop_->assertInLoopThread();EventLoop* loop = baseLoop_;if (!loops_.empty()){loop = loops_[hashCode % loops_.size()];}return loop;}// 获取所有的EventLoop对象std::vector<EventLoop*> EventLoopThreadPool::getAllLoops(){baseLoop_->assertInLoopThread();assert(started_);if (loops_.empty()){return std::vector<EventLoop*>(1, baseLoop_);}else{return loops_;}}
0 0
- muduo库阅读(36)——Net部分:事件循环线程池EventLoopThreadPool
- muduo网络库学习(八)事件驱动循环线程池EventLoopThreadPool
- muduo库阅读(35)——Net部分:用于执行事件循环(EventLoop)的线程类EventLoopThread
- muduo库阅读(29)——Net部分:Reactor(EventLoop事件循环)
- muduo库阅读(30)——Net部分:事件处理器Channel
- muduo库阅读(9)——线程池
- muduo库阅读(43)——Net部分:轮询器的epoll实现——EPollPoller
- muduo库阅读(31)——Net部分:定时器(计时器)Timer
- muduo库阅读(32)——Net部分:定时器(计时器)ID类TimerId
- muduo库阅读(23)——Net部分:应用层缓冲区类
- muduo库阅读(24)——Net部分:网络地址类
- muduo库阅读(25)——Net部分:服务器端的套接字类
- muduo库阅读(26)——Net部分:套接字常用操作的封装
- muduo库阅读(27)——Net部分:字节顺序转换的封装
- muduo库阅读(28)——Net部分:各类回调函数的定义
- muduo库阅读(33)——Net部分:定时器队列TimerQueue
- muduo库阅读(34)——Net部分:轮询器基类Poller
- muduo库阅读(37)——Net部分:压缩数据流ZlibOutputStream
- UVA 1395 Slim Span(kruskal算法)
- 08 Running Flink on YARN leveraging Tez
- 解决网络丢包问题及故障判断方法
- Gson简要使用笔记
- Leetcode152: Gas Station
- muduo库阅读(36)——Net部分:事件循环线程池EventLoopThreadPool
- Hanoi(汉诺塔)问题
- Android之android.intent.category.LAUNCHER的用途和使用
- 使用libsvm工具箱,README文档要仔细阅读
- 09 JobManager 高可用安装(HA)
- 《王爽——汇编语言》P206 实验室10第三个问题的答案
- Angular js 随手记
- 10 配置的详细说明
- MPLS L3VPN跨域方法 Option A/B/C