繁体   English   中英

多线程epoll

[英]multithreaded epoll

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

  1. 为每个线程创建一个事件循环,并添加服务器套接字的文件描述符以在每个线程上查找通知。 (这可能吗?我的意思是:epoll线程安全吗?)
  2. 创建单个事件循环并等待通知。 每当收到通知时,产生一个线程来处理它。

如果我使用第一种方法,是否有机会通过同一事件通知多个线程? 我该如何处理这种情况?

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

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

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

我也在使用epoll编写服务器,我考虑过你所附的相同型号。

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

你还可以使用以下型号:

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

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

epoll是线程安全的,一个很好的解决方案是你的主进程保持在accept(2),一旦你得到文件描述符寄存器epoll fd中的目标线程,这意味着你有一个每个线程的epoll队列,一旦你创建了线程,你就会在调用pthread_create(3)中共享epoll文件描述符作为参数,所以当一个新连接到达时,你会使用epoll fd为目标线程做一个epoll_ctl(... EPOLL_CTL_ADD ..)接受(2)后创建的新套接字,有意义吗?

每个线程的事件循环是最灵活的高性能您应该为每个事件循环创建一个epoll fd,不用担心epoll线程安全问题。

epoll是线程安全的

希望以下代码可以帮助您

https://github.com/jingchunzhang/56vfs/blob/master/network/vfs_so_r.c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM