Back to VNotes

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 和写回仍集中在主线程,这样连接生命周期更可控。