1

我想使用 epoll 和EPOLLET.

我已经看到有几种可能性:

  1. 每个线程都有自己的 epoll fd,bind()使用SO_REUSEPORT(但仅限于 Linux 内核 3.9)并处理自己的连接。EPOLLONESHOT在这种情况下不需要,因为每个线程都处理自己的文件描述符。

  2. 有一个接受连接的主线程和几个处理这些连接的工作线程。每个工作线程都有自己的 epoll fd。在这种情况下,主线程如何在工作线程之间公平分配连接?它可以使用循环方式将文件描述符添加到另一个线程的 epoll fd(但可能会发生该特定线程仍在忙于处理另一个连接)。或者可以将连接添加到全局队列中,并且主线程将使用pthread_cond_signal(),但是我们需要一个互斥锁和一个条件变量。

  3. 有一个接受连接的主线程和几个处理这些连接的工作线程。在这种情况下将需要一个全局 epoll fd,EPOLLONESHOT因此并非所有线程都为同一事件唤醒。

我知道,如果EPOLLET使用,一旦我收到有关事件的通知,我必须耗尽 fd,直到我得到EAGAIN.

如果不支持套接字选项SO_REUSEPORT(旧内核),哪个选项最好?

4

2 回答 2

1
  1. 1. 但没有 SO_REUSEPORT 的变体是有一个共享的侦听套接字。每个工作线程运行自己的事件循环,除了处理自己的连接外,它们还在侦听套接字上执行非阻塞的 accept()。有关更详尽的描述,请参见例如http://aosabook.org/en/nginx.html
于 2016-03-12T20:53:52.757 回答
0
  1. 不使用的解决方案SO_REUSEPORT是拥有一个公共的 epoll fd 和一个公共的侦听器,它们在所有线程之间共享。EPOLLONESHOT是必需的,因此一次只有一个线程处理某个 fd 的事件。
于 2016-03-19T17:15:12.627 回答