muduo库源码分析4——TcpServer线程池分析

 

TcpServer线程池分析

        muduo库支持线程池处理io功能。即一个TcpServer除了具备一个用于接受连接请求和处理定时器的主线程事件循环EventLoop* loop_外,还具备一个EventLoopThreadPool *threadPool_线程池对象用于存储若干io线程事件循环。其中,boost::ptr_vector threads_容器存储事件循环线程,std::vector loops_容器存储事件循环。

        构造TcpServer对象后,若在服务启动TcpServe::start()调用前,调用TcpServer::setThreadNum(int numThreads)函数设置线程池数量,则TcpServe::start()中会调用EventLoopThreadPool::start()函数启动numThreads个io子线程并分别绑定事件循环。

 

线程池启动调用流程:

>muduo::net::TcpServer server_;
>server_.setThreadNum(5); // 设定线程池线程数为5
>server_.start(); //启动服务
| >threadPool_->start(threadInitCallback_); //启动线程池
| | >for (int i = 0; i < numThreads_; ++i)
| | | >EventLoopThread* t = new EventLoopThread(cb, buf); //构造io事件循环线程
| | | >threads_.push_back(t); 
| | | >loops_.push_back(t->startLoop()); 

 

接受新连接处理调用流程:

>Acceptor::handleRead() //Acceptor检测到新连接时调用
| >newConnectionCallback_(connfd, peerAddr);
| | >即调用TcpServer::newConnection(int sockfd, const InetAddress& peerAddr)
| | | >EventLoop* ioLoop = threadPool_->getNextLoop(); //为新连接绑定io线程
| | | | >EventLoop* loop = baseLoop_; //若线程池为空,则默认使用Tcp主线程完成io
| | | | >if (!loops_.empty()) //线程池非空
| | | | | >loop = loops_[next_]; // round-robin算法选择io线程
| | | > // 构造TcpConnection连接对象,注册事件回调,完成初始化。

 

你可能感兴趣的:(c/c++开发,网络开发)