这是问题 14221339 的后续内容。
我有一个在epoll_wait()
循环内运行的线程池。
一个外部线程调用epoll_ctl()
并添加一个侦听器套接字
(EPOLLET | EPOLLONESHOT | EPOLLIN)
.
当线程池只有一个线程时,它会间歇性地无法接收EPOLLIN
第一次(也是唯一一次)连接尝试的事件。如果我将线程池增加到两个,它几乎总是无法接收到EPOLLIN
事件。
我的理解是 epoll API 是线程安全的,但这种观察似乎表明并非如此。
这是问题 14221339 的后续内容。
我有一个在epoll_wait()
循环内运行的线程池。
一个外部线程调用epoll_ctl()
并添加一个侦听器套接字
(EPOLLET | EPOLLONESHOT | EPOLLIN)
.
当线程池只有一个线程时,它会间歇性地无法接收EPOLLIN
第一次(也是唯一一次)连接尝试的事件。如果我将线程池增加到两个,它几乎总是无法接收到EPOLLIN
事件。
我的理解是 epoll API 是线程安全的,但这种观察似乎表明并非如此。
With edge-triggered semantics, an incorrect sequence of calls can result in a race condition. There are three system calls involved:
If executed (repeatedly) in this order, a race between #3 and #1 is possible: when the input event in the kernel occurs after EAGAIN has been returned but before epoll_ctl() can be acted on. In general, the re-activation needs to be done before the I/O.
(Obviously, the I/O needs to be non-blocking.)