假设 Web 服务器利用
SO_REUSEPORT
来改进多线程服务器中的负载分配,即每个线程打开自己的侦听套接字(在同一端口上),其文件描述符被添加到每个线程的 epoll
实例中。
epoll
可以监视特定的文件描述符以接受由signalfd()
创建的信号。
收到信号后,每个线程的 epoll_wait
将返回一个我们自然想要读取的事件。然而,信号的出现只能读取一次,因此只有一个线程会获取有关该信号的信息(除非另有说明,否则其他线程将在 read
上被阻塞)。
您是否会说有一个简单的解决方案,或者这会导致
signalfd
在这种特定情况下几乎无法使用?
谢谢。
一个可能的解决方案是为每个等待的线程创建一个额外的文件描述符(通过
epoll()
)。为此,请使用eventfd()。然后,一旦线程收到信号,它就可以在所有事件文件描述符上广播事件(简单的 write()
调用)以警告其他线程。