小智 5

处理此问题的方法是在传递给poll()的描述符列表中包含一个额外的文件描述符。对于该描述符,等待读取准备就绪。是否有任何其他线程想要唤醒等待poll()的线程写入该额外的描述符。此时,名为poll()的线程将继续执行,并看到额外的描述符是唤醒它的对象,然后执行任何操作。

最初获取此额外文件描述符的通常方法是使用pipe()打开未命名的管道。这样,您就有两个描述符:一个描述符将轮询等待传递给poll(),另一个描述符将其写入以唤醒等待poll()的线程。


Kar*_*rlU 5

想要在超时之前唤醒阻塞 poll(2) 或 select(2) 有很多正当理由。任何时候您需要从正在轮询的 fd 列表中添加或删除套接字,您都需要中断等待。如果您依赖超时,则超时必须很短才能响应,但短暂的超时可能会导致大量不必要的颠簸。

无论如何,对于 Linux,您可以使用eventfd(2)创建一个文件描述符以添加到您的 fd 列表中。当您需要中断等待时,请写入 eventfd。


Rol*_*ith -1

在轮询调用中使用超时,这样它就不会无限期地阻塞。注意:超时值以毫秒为单位。