多线程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