muduo 多线程的处理

这几天详细读了muduo的网络处理部分,发现多线程处理是整个框架的精华。muduo是基于one loop per thread模型的。那么什么是one loop per thread模型呢?

字面意思上讲就是每个线程里有个loop,即消息循环。我们知道服务器必定有一个监听的socket和1到N个连接的socket,每个socket也必定有网络事件。我们可以启动设定数量的线程,让这些线程来承担网络事件。

每个进程默认都会启动一个线程,即这个线程不需要我们手动去创建,称之为主线程。一般地我们让主线程来承担监听socket的网络事件。至于连接socket的事件要不要在主线程中处理,这个得看我们启动其他线程即工作线程的数量。如果启动了工作线程,那么连接socket的网络事件一定是在工作线程中处理的。

每个线程的事件处理都是在一个EventLoop的while循环中,而每一个EventLoop都有一个多路事件复用解析器epoller。循环的主体部分是等待epoll事件触发,从而处理事件。主线程EventLoop的epoller会添加监听socket可读事件,而工作线程只添加了定时器处理事件(每个EventLoop都会有,主线程有EventLoop,当然也添加了定时器处理事件)。在没有事件触发之前,epoller都是阻塞的,导致线程被挂起。

当有连接来到时,挂起的主线程恢复,会执行新连接的回调函数。在该函数中,会从线程池中取得一个线程来接管新连接socket的处理。那么问题来了,既然工作线程已经阻塞了,那他是如何处理新连接socket相关事件的呢,也就是什么时候恢复呢?

原来,每个EventLoop还有一个wakeup事件。主线程通知工作线程去处理事件的时候,工作线程发现不在本线程的时间片中,于是唤醒工作线程了。

有关代码,下篇再分析。

猜你喜欢

转载自blog.csdn.net/zxm342698145/article/details/81384415