博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
muduo源码分析 EventLoopThreadPool 类
阅读量:3940 次
发布时间:2019-05-24

本文共 2157 字,大约阅读时间需要 7 分钟。

文章目录

EventLoopThreadPool 是一个线程池,只不过该线程池有一点特殊,该线程池中的每一个线程都要执行EventLoop进行文件描述符的监听。
此时一个线程用于管理分配线程池中的EventLoop,如果线程池为空,主线程的EventLoop用与监听所有的文件描述符
在源码中解释。

构造与析构

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}

start 开启线程池

void EventLoopThreadPool::start(const ThreadInitCallback& cb){
assert(!started_); baseLoop_->assertInLoopThread(); started_ = true; //创建numThreads_个事件循环器 for (int i = 0; i < numThreads_; ++i) {
char buf[name_.size() + 32]; snprintf(buf, sizeof buf, "%s%d", name_.c_str(), i); //创建一个EventLoopThread 对象 EventLoopThread* t = new EventLoopThread(cb, buf); threads_.push_back(std::unique_ptr
(t)); //事件循环器开始执行,如果此时需要监听的文件描述符的数量小于线程个数 //其余的线程会进入睡眠状态 loops_.push_back(t->startLoop()); } //线程池的个数为0,则主线程开始监听套接字 if (numThreads_ == 0 && cb) {
cb(baseLoop_); }}

getNextLoop 采用轮询的方式分配EventLoop

//循环获取事件循环器//每个线程对应一个事件循环器EventLoop* EventLoopThreadPool::getNextLoop(){
baseLoop_->assertInLoopThread(); assert(started_); EventLoop* loop = baseLoop_; //如果线程池为空,返回主线程的EventLoop if (!loops_.empty()) {
// round-robin loop = loops_[next_]; ++next_; //循环获取,如果next_的值大于了loops_.size(), 从第一个开始获取 if (implicit_cast
(next_) >= loops_.size()) {
next_ = 0; } } //返回事件循环器 return loop;}

getLoopForHash采用hash方式分配EventLoop

//hash 的方式获取EventLoop 事件循环器EventLoop* EventLoopThreadPool::getLoopForHash(size_t hashCode){
baseLoop_->assertInLoopThread(); EventLoop* loop = baseLoop_; if (!loops_.empty()) {
//hash 的方式获取EventLoop 事件循环器 loop = loops_[hashCode % loops_.size()]; } return loop;}

getAllLoops 返回所有的EventLoop

//返回所有的loopstd::vector
EventLoopThreadPool::getAllLoops(){
baseLoop_->assertInLoopThread(); assert(started_); //如果线程池为空 if (loops_.empty()) {
//将主线程的EventLoop 返回 return std::vector
(1, baseLoop_); } else {
//否则 返回线程池中的EventLoop return loops_; }}

转载地址:http://sanwi.baihongyu.com/

你可能感兴趣的文章
U盘的挂载过程-先记录一下
查看>>
python程序启动过程报错的排错一般步骤
查看>>
linux下UEFI的管理
查看>>
类thinkpad笔记本安装deepinv20后启动黒屏的解决
查看>>
利用本地centos镜像升级centOS
查看>>
FreeBSD常用操作
查看>>
VC及esxi升级的必要性和步骤
查看>>
hp DL338服务器修改ilo管理地址
查看>>
vmware convert P2V 错误二三事
查看>>
让kali2020中的zsh有补完功能
查看>>
python解开压缩文件6位纯数字密码
查看>>
5620系列密码清除
查看>>
vncsever-centos&debian
查看>>
华为snmp模板
查看>>
kvm&xen挂载镜像文件
查看>>
华为路由器配置NAT使内网用户通过外网IP地址方式访问内网服务器示例
查看>>
virt命令
查看>>
15个保障服务器安全的方法:
查看>>
在VMware Workstation 中部署VCSA6.5
查看>>
openstack&ceph
查看>>