我无法唤醒被poll.poll()函数阻止的线程。有人能帮助我吗?
答案 0 :(得分:5)
处理此问题的方法是在传递给poll()的描述符列表中包含额外的文件描述符。对于该描述符,等待读取准备就绪。有任何其他线程想要唤醒线程等待poll()写到额外的描述符。此时,调用poll()的线程恢复执行,看到额外的描述符是唤醒它的那个,并做了什么。
最初获取此额外文件描述符的常用方法是使用pipe()打开一个未命名的管道。这样你有两个描述符:你在poll()上打开读取等待的那个和你写入的另一个描述唤醒等待poll()的线程。
答案 1 :(得分:4)
有许多合理的理由想要在超时之前唤醒阻止轮询(2)或选择(2)。无论何时需要在被轮询的fd列表中添加或删除套接字,都需要摆脱等待。如果您依赖于超时,则超时必须很短才能响应,但是超时会导致很多不必要的抖动。
无论如何,对于Linux,您可以使用eventfd(2)创建要添加到fd列表的文件描述符。当您需要中断等待时,请写入eventfd。
答案 2 :(得分:-1)
在轮询调用中使用超时,因此它不会无限期阻止。 N.B。:超时值以毫秒为单位。