我想使用 epoll 和EPOLLET
.
我已经看到有几种可能性:
每个线程都有自己的 epoll fd,
bind()
使用SO_REUSEPORT
(但仅限于 Linux 内核 3.9)并处理自己的连接。EPOLLONESHOT
在这种情况下不需要,因为每个线程都处理自己的文件描述符。有一个接受连接的主线程和几个处理这些连接的工作线程。每个工作线程都有自己的 epoll fd。在这种情况下,主线程如何在工作线程之间公平分配连接?它可以使用循环方式将文件描述符添加到另一个线程的 epoll fd(但可能会发生该特定线程仍在忙于处理另一个连接)。或者可以将连接添加到全局队列中,并且主线程将使用
pthread_cond_signal()
,但是我们需要一个互斥锁和一个条件变量。有一个接受连接的主线程和几个处理这些连接的工作线程。在这种情况下将需要一个全局 epoll fd,
EPOLLONESHOT
因此并非所有线程都为同一事件唤醒。
我知道,如果EPOLLET
使用,一旦我收到有关事件的通知,我必须耗尽 fd,直到我得到EAGAIN
.
如果不支持套接字选项SO_REUSEPORT
(旧内核),哪个选项最好?