多线程epoll

Uma*_*mil 9 c sockets linux multithreading epoll

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

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

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

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

小智 5

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

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