http线程池的主要用途是异步处理使用无状态短连接的http请求,在传输层通信基于tcp协议和应用层基于http协议的基础上,达到c++服务器与web服务器通信的目的。
设计上:
(1)服务器启动时,初始化配置数量的线程(形成被动连接线程池)。每个线程会生成epoll描述符。
(2)主线程生成监听socket,绑定端口。生成epoll描述符,注册监听socket,非阻塞接收(限定最大时间,如2s)新连接到连接队列。
(2)投放主线程连接队列中的新连接到被动连接线程池。根据硬哈希选择需求的线程来投放。加入后需要注册连接socket(注册时连接对象作为epoll事件的携带数据)到线程的epoll描述符。
(3)在每个线程的例程里会非阻塞监听epoll描述符上发生的读事件,并解析和处理获取的http请求。
这样每个业务线程可以相对独立的处理无状态的http请求。跟单业务线程的场景不同的是,http线程池的线程之间尽量减少数据共享(实在需要缓存在内存则加锁),每个线程又可以作为客户端短时间阻塞向其他服务器请求数据。
http线程池代码如下:(大致上http线程池的思路可以看得出来。主线程接收连接对象和连接对象接收数据并没有在这里展现实现过程。注意接收时需要忽略EINTR和SIGPIPE信号,如果接收返回-1且错误号为EAGAIN或EWOULDBLOCK,说明接收缓冲区满了,需要继续尝试接收,直到超时。接收返回0则表示对方断开连接,则接收失败。接收成功、失败、超时都需要移除连接对象(epoll描述符注销连接socket、关闭socket、移出和销毁连接对象),因为是短连接&#x