2016-01-02 41 views
2

如果一个线程(如X)正在等待epoll_wait(),另一个线程(比如Y)会调用epoll_ctl()来注册对文件描述符9的兴趣。先前在线程X中调用epoll_wait()能否返回线程Y添加的文件描述符9?对epoll_wait()的初始呼叫在任何时候都不会在中间返回。epoll或kqueue可以处理文件描述符自身的异步添加

现在我想比较一下,并询问操作系统中另外两个轮询调用的相关问题。 poll()kqueue

  1. 如果回答上述问题是真的,那么有没有办法实现与poll()系统调用类似的行为?
  2. 让我们假设epoll_ctl()是线程安全的,并且线程X可以安全地调用epoll_ctl()并致电epoll_wait()返回文件描述符9是否已准备好进行I/O。声明对文件描述符感兴趣的函数和等待的函数的分离是什么使得该函数令人惊讶。但是人们经常将kqueueepoll称为用于相同的功能。但kqueue没有单独的函数来声明获取描述符的事件反馈的兴趣。有没有人知道kqueue如何以与epoll类似的方式使用? epoll似乎是最好的线程安全的选项那里现在如果它允许线程“申报利益”
+1

有了'kqueue'你可能*申报利益* *没有得到事件反馈*通过传递0作为'nevents'参数。看,例如,[这个答案](http://stackoverflow.com/questions/5756402/how-do-i-replace-select-with-kevent-for-higher-performance) – Tsyvarev

回答

2

man epoll_wait

当一个线程阻塞调用epoll_pwait(),它是另一个线程可能会将文件描述符添加到等待的epoll实例中。如果新文件描述符准备就绪,它将导致epoll_wait()调用解除阻塞。

因此epoll_wait监视在等待时添加的文件描述符。

这种行为不能通过poll()/ select()来实现,因为他们读取一组文件描述符一次,所以无法修改当前轮询的文件描述符集合。

[当然,如果你路过epoll_create创建poll()/select()文件描述符,这个文件描述符的修改将被跟踪与epoll_wait]

+0

我不知道有一个'epoll_pwait' ..'epoll_wait()'和'epoll_pwait()'有什么区别? – Curious

+1

嗯,它看起来像手册页中的印刷错误:在同一句中它使用'epoll_pwait'和'epoll_wait',而实际上意味着相同的功能。 'epoll_pwait'不同于'epoll_wait',因为它还允许在执行期间给定信号集。请参阅男人了解更多细节。 – Tsyvarev

+0

'epoll_pwait'不是印刷错误,它是'epoll_wait'的一个变种,它允许进行安全信号处理的管理。阅读更多信息[这里](http://linux.die.net/man/2/epoll_pwait)。 – Myst