5

我无法唤醒被 poll.poll() 函数阻塞的线程。有人可以帮助我吗?

4

3 回答 3

7

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

最初获取这个额外文件描述符的正常方法是使用 pipe() 打开一个未命名的管道。这样你就有了两个描述符:一个是你在 poll() 中传递读取等待,另一个是你写入以唤醒等待 poll() 的线程。

于 2013-06-27T01:59:39.570 回答
5

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

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

于 2014-03-07T01:10:32.923 回答
-1

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

于 2012-08-21T07:36:14.690 回答