我无法唤醒被poll.poll()函数阻塞的线程。有人可以帮我吗?
小智 5
处理此问题的方法是在传递给poll()的描述符列表中包含一个额外的文件描述符。对于该描述符,等待读取准备就绪。是否有任何其他线程想要唤醒等待poll()的线程写入该额外的描述符。此时,名为poll()的线程将继续执行,并看到额外的描述符是唤醒它的对象,然后执行任何操作。
最初获取此额外文件描述符的通常方法是使用pipe()打开未命名的管道。这样,您就有两个描述符:一个描述符将轮询等待传递给poll(),另一个描述符将其写入以唤醒等待poll()的线程。
想要在超时之前唤醒阻塞 poll(2) 或 select(2) 有很多正当理由。任何时候您需要从正在轮询的 fd 列表中添加或删除套接字,您都需要中断等待。如果您依赖超时,则超时必须很短才能响应,但短暂的超时可能会导致大量不必要的颠簸。
无论如何,对于 Linux,您可以使用eventfd(2)创建一个文件描述符以添加到您的 fd 列表中。当您需要中断等待时,请写入 eventfd。