程序使用Reactor模型,主线程使用epoll作为IO多路复用的实现方式,只负责监听文件描述符上是否有事件发生,有的话就将对应的文件描述符交给工作线程来处理, 工作线程是在程序开始时便创建的固定数量线程池,避免了频繁创建线程带来的开销。
在项目中有一个主线程和四个工作线程,主线程将任务添加到线程池,任务即就绪待处理的文件描述符,epoll使用EPOLLONESHOT保证一个socket连接在任意时刻都只被一个线程处理
epoll的触发模式选择了ET模式,ET模式要比高效很多,不会被同一事件触发多次,每次读都必须循环读取直到EAGIN错误,确保处理完。