3

如果一个线程(比如 X)正在等待epoll_wait()另一个线程(比如 Y)调用epoll_ctl()以注册对文件描述符的兴趣9。之前在线程 X 中的调用能否epoll_wait()返回线程 Y 添加的文件描述符9?初始调用epoll_wait()在任何时候都不会在中间返回。

现在我想对此进行比较,并就操作系统中的另外两个轮询调用提出相关问题。poll()kqueue

  1. 如果上述问题的答案是正确的,那么有没有办法通过poll()系统调用实现类似的行为?
  2. 让我们假设它epoll_ctl()是线程安全的,线程 X 可以安全地调用epoll_ctl()并通过调用epoll_wait()返回文件描述符9是否准备好进行 I/O。声明对文件描述符感兴趣的函数和等待函数的分离是使这个函数令人惊叹的原因。但是人们经常将kqueueandepoll称为用于相同的功能。但是kqueue,没有单独的函数来声明对获取描述符的事件反馈感兴趣。有谁知道如何kqueue以类似的方式使用epollepoll如果它允许线程安全“利益声明”,它似乎是目前最好的线程安全选项
4

1 回答 1

3

来自man epoll_wait

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

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

poll()/select() 无法实现这种行为,因为它们读取文件描述符集一次,因此无法修改当前轮询的文件描述符集。

[当然,如果你传递一个由epoll_createto创建的文件描述符poll()/select(),这个文件描述符的修改将被跟踪为epoll_wait。]

于 2016-01-02T12:03:16.487 回答