1. 首先是根据陈硕老师的muduo库手册p11的类图,结合自己的学习所得画的一个更详细的流程,使用IO线程池与计算线程池。
(1)计算线程中,task()
调用TcpConnection::send()
向IO线程的EventLoop注册完一个sendInLoop()
任务之后,并不需要关心接下去数据的发送情况。
如果一次发送不完,会自动关注POLLOUT事件,多次调用TcpConnection::handleWrite()
直到全部发送完毕。发送完毕后会取消关注POLLOUT事件,并回调onWriteComplete()
。
(2)执行onMessage()
之前,TcpConnection::handleRead()
已经把收到的数据保存至inputBuffer中。
(3)onMessage()
只关心是哪个TcpConnection收到的数据,并不关心这个TcpConnection目前归哪个IO线程管理。
2. 自己对Task处理完成后发送数据步骤的设想,可以和上图结合着看:
void workFunc(const TcpConnectionPtr& conn,
Buffer* buf,
Timestamp time){
conn->send(...);
}
MessageCallback(ThradPool *tp
const TcpConnectionPtr& conn,
Buffer* buf,
Timestamp time){
tp->run(boost::bind(workFunc,conn,buf,time));
}
int main(){
ThreadPool tp;
TcpServer server(...);
server.setMessageCallback(boost::bind(MessageCallback,&tp,_1,_2,_3));
server.start();
}
3. 以onMessageCallBack()为例的注册与回调过程:
不包含计算线程池的情况下,IO线程不仅要执行IO任务,也需要执行计算任务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)