6.3.3 线程模型
muduo 的线程模型符合我主张的one loop per thread + thread pool 模型。每个线程最多有一个EventLoop,每个TcpConnection 必须归某个EventLoop 管理,所有的IO 会转移到这个线程。换句话说,一个file descriptor 只能由一个线程读写。TcpConnection 所在的线程由其所属的EventLoop 决定,这样我们可以很方便地把不同的TCP 连接放到不同的线程去,也可以把一些TCP 连接放到一个线程里。
TcpConnection 和EventLoop 是线程安全的,可以跨线程调用。
TcpServer 直接支持多线程,它有两种模式:
单线程,accept(2) 与TcpConnection 用同一个线程做IO。
多线程,accept(2) 与EventLoop 在同一个线程,另外创建一个EventLoop-ThreadPool,新到的连接会按round-robin 方式分配到线程池中。
后文§6.6 还会以Sudoku 服务器为例再次介绍muduo 的多线程模型。
结语
muduo 是我对常见网络编程(www.cppentry.com)任务的总结,用它我能很容易地编写多线程的TCP服务器和客户端。muduo 是我业余时间的作品,代码估计还有一些bug,功能也不完善(例如不支持signal 处理10),待日后慢慢改进吧。