首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中具有epoll和EPOLLET的多线程TCP侦听器

C中具有epoll和EPOLLET的多线程TCP侦听器
EN

Stack Overflow用户
提问于 2016-03-12 18:32:00
回答 2查看 1K关注 0票数 1

我想使用epoll和EPOLLET编写多线程TCP侦听器。

我看到有几种可能性:

  1. 每个线程都有自己的epoll fd,bind()使用SO_REUSEPORT (但只使用UPLinux内核3.9)并处理自己的连接。在这种情况下不需要EPOLLONESHOT,因为每个线程都处理自己的文件描述符。
  2. 有一个接受连接的主线程和几个处理这些连接的工作线程。每个工作线程都有自己的epoll fd。在这种情况下,主线程如何公平地在工作线程之间分配连接?它可以使用循环方式将文件描述符添加到另一个线程的epoll fd中(但可能会发生该特定线程仍忙于处理另一个连接的情况)。也可以将连接添加到全局队列中,主线程将使用pthread_cond_signal(),但随后需要互斥和条件变量。
  3. 有一个接受连接的主线程和几个处理这些连接的工作线程。这里有一个全局的epoll fd,在本例中需要EPOLLONESHOT,所以不是所有的线程都会为相同的事件被唤醒。

我知道,如果使用EPOLLET,一旦收到关于事件的通知,我就必须耗尽fd,直到得到EAGAIN为止。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-19 17:15:12

  1. 不使用SO_REUSEPORT的解决方案是拥有一个公共的epoll和一个在所有线程之间共享的公共侦听器。EPOLLONESHOT是必需的,因此一次只有一个线程处理特定fd的事件。
票数 0
EN

Stack Overflow用户

发布于 2016-03-12 20:53:52

  1. 一个变体为1,但没有SO_REUSEPORT,就是有一个共享的侦听套接字。每个工作线程运行自己的事件循环,除了处理自己的连接之外,它们还在侦听套接字上执行一个非阻塞的accept()。有关更详细的描述,请参见例如http://aosabook.org/en/nginx.html
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35961689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档