C++ WebServer / 04
v3.0:加入线程池
v3.0 引入 epoll + ThreadPool。主线程继续负责 I/O 事件和 fd 生命周期,工作线程负责请求处理。
这一阶段要解决什么问题
epoll 解决了多个连接的事件等待问题,但如果请求解析和响应构造都放在主线程,事件循环仍可能被业务处理拖慢。线程池用于把耗时处理从主循环中拆出去。
原来的实现有什么缺陷
单线程 epoll 可以管理多个 fd,但它仍是单执行流。只要某个请求处理逻辑变复杂,其他连接的事件响应就会变慢。
我是怎么改的
主线程读到数据后,把 Connection 和版本号封装为任务放入线程池。工作线程调用 process_read,生成结果后放入 result_queue,并通过 eventfd 唤醒主 Reactor。
核心代码 / 关键逻辑
main reactor:
read data -> enqueue Task(Connection*, version)
worker:
code = conn->process_read()
conn->set_connection_state(READ / WRITE / CLOSE)
push result_queue
write(eventfd)
main reactor:
eventfd readable -> handle_threadpool_result()
踩坑记录
线程池不是为了让 epoll 更快,而是避免业务处理阻塞事件循环。fd 的 close、epoll_ctl 和写回仍集中在主线程,这样连接生命周期更可控。