多线程epoll

我正在使用epoll(边缘触发)和非阻塞套接字创建多线程服务器。 目前我正在主线程上创建一个事件循环并等待通知,并且它可以正常工作
我必须在两种方法之间进行选择以使其成为多线程:

  • 为每个线程创建一个事件循环,并添加服务器套接字的文件描述符以在每个线程上查找通知。 (可能吗?我的意思是:epoll是线程安全的吗?)
  • 创建单个事件循环并等待通知。 每当收到通知时,产生一个线程来处理它。
  • 如果我使用第一种方法,是否有机会让多个线程得到相同事件的通知? 我该如何处理这种情况?

    什么是最好的方法? 谢谢。


    我认为选项1更受欢迎,因为非阻塞IO的主要目的是避免创建和销毁线程的开销。

    以流行的Web服务器nginx为例,它创建多个进程(不是线程)来处理句柄上的传入事件,并处理子进程中的事件。 它们都共享相同的侦听套接字。 它与选项1非常相似。


    我也在用epoll编写一个服务器,并且我已经考虑过与你相同的模型。

    可以使用选项1,但它可能会导致“雷鸣群”效应,您可以阅读nginx的来源以找到解决方案。 至于选项2,我认为最好使用线程池而不是每次产生一个新的线程。

    你也可以使用下面的模型:

    主线程/进程: accept阻塞IO的传入连接,并使用BlockingList或其他进程使用PIPE将fd发送给其他线程。

    子线程/进程:分别创建一个epoll实例,并将传入的fd添加到epoll ,然后使用非阻塞IO处理它们。


    epoll是线程安全的,一个好的解决方案是你的主进程停留在accept(2)中,一旦你得到文件描述符,在目标线程的epoll fd中注册一个文件描述符,这意味着你为每个线程都有一个epoll队列,一旦创建了线程,就可以在调用pthread_create(3)中共享epoll文件描述符作为参数,因此当新连接到达时,使用目标线程的epoll fd执行epoll_ctl(... EPOLL_CTL_ADD ..)接受(2)后创建的新套接字,是否合理?

    链接地址: http://www.djcxy.com/p/61347.html

    上一篇: multithreaded epoll

    下一篇: epoll with Edge Triggered event