加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
EventLoopThreadPool.cc 1.47 KB
一键复制 编辑 原始数据 按行查看 历史
#include "EventLoopThreadPool.h"
#include "EventLoopThread.h"
#include <memory>
EventLoopThreadPool::EventLoopThreadPool(EventLoop* baseLoop, const std::string& nameArg)
:baseLoop_(baseLoop)
,name_(nameArg)
,started_(false)
,numThreads_(0)
,next_(0){
}
EventLoopThreadPool::~EventLoopThreadPool(){
//不需要析构loop,loop是个栈变量
}
void EventLoopThreadPool::start(const ThreadInitCallback& cb){
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(std::unique_ptr<EventLoopThread>(t));
loops_.push_back(t->startLoop()); //底层创建线程,绑定一个新的EventLoop,并返回该loop的地址
}
//没进for循环,那么说明整个服务端只有一个线程,就只运行着baseLoop
if(numThreads_ == 0 && cb){
cb(baseLoop_);
}
}
//如果工作在多线程中,baseLoop_中默认以轮询的方式分配Channel给subLoop
EventLoop* EventLoopThreadPool::getNextLoop(){
EventLoop* loop = baseLoop_;
if(!loops_.empty()){ //通过轮询方式获取下一个处理事件的loop
loop = loops_[next_];
++next_;
if(next_ >= loops_.size()){
next_ = 0;
}
}
return loop;
}
std::vector<EventLoop*> EventLoopThreadPool::getAllLoops(){
if(loops_.empty()){
return std::vector<EventLoop*>(1, baseLoop_);
}
else{
return loops_;
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化