通八洲科技

c++如何用epoll实现高并发 c++ I/O多路复用【网络编程】

日期:2025-12-24 00:00 / 作者:裘德小鎮的故事
用epoll实现高并发I/O的核心是将socket设为非阻塞并配合epoll_create1、epoll_ctl和epoll_wait构建事件驱动循环;需用RAII封装epoll fd,监听socket注册EPOLLIN,客户端socket注册EPOLLIN|EPOLLET,并循环recv直至EAGAIN/EWOULDBLOCK。

用 epoll 实现高并发 I/O,在 C++ 中核心是把 socket 设置为非阻塞模式,配合 epoll_createepoll_ctlepoll_wait 构建事件驱动循环,避免为每个连接开线程或进程。

创建和管理 epoll 实例

调用 epoll_create1(0) 创建一个 epoll 实例,返回的 fd 是后续操作的句柄。建议用 RAII 封装,确保析构时自动 close()。注意不要重复创建多个 epoll 实例——一个线程一个就够了,多线程可考虑每个线程独立 epoll + 独立事件循环,或用主从 reactor 模式。

非阻塞 socket 与边缘触发(ET)配合

ET 模式下,epoll 只在 fd 状态变化时通知一次,必须一次性读完所有可用数据(直到 recv 返回 EAGAINEWOULDBLOCK),否则可能丢事件。因此每个 socket 对应的缓冲区要自己管理,不能依赖一次 read 就清空。

事件分发与连接生命周期管理

每次 epoll_wait 返回一批就绪事件,需遍历处理。关键是要把 fd 和业务逻辑(如连接对象、读写缓冲区、状态机)绑定起来。推荐用 std::unordered_map 或更安全的 std::map(fd 为 key),避免裸指针悬挂。

性能与健壮性要点

epoll 本身不解决粘包、协议解析、超时、内存泄漏等问题,这些都得自己补全。一个稳定的服务至少要: