当另一个线程等待这个 epoll 描述符时,我可以将套接字添加到 epoll 描述符吗?

alk*_*edr 3 sockets multithreading epoll

我有几个线程,其中一个epoll_wait在循环中调用,其他线程可以打开需要epoll由第一个线程处理的连接。是否可以epoll_ctl在另一个线程等待时添加新套接字epoll_wait

在以下场景中会发生什么:

  1. 线程 1 调用 epoll_wait。
  2. 线程 2 创建一个 socket(A) 并使用 epoll_ctl 将其添加到 epoll 实例中。
  3. 有人发送了一些数据,套接字 A 准备好进行 read() 调用。

epoll_wait 会返回套接字 A 吗?

Dav*_*rtz 5

是的,它会。epoll套接字的全部意义在于您不必重复努力。不涉及快照或使用多个等待队列。

在幕后,epoll 套接字有自己的等待队列。当您阻塞 epoll 套接字时,您将被添加到该单个等待队列中。没有保存状态或类似的东西。状态在 epoll 套接字本身中。