epoll或kqueue可以自己处理文件描述符的异步添加

时间:2016-01-02 00:43:27

标签: c++ multithreading sockets epoll kqueue

如果一个线程(比如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是否已准备就绪/ O。声明对文件描述符感兴趣的函数和等待函数的分离将使这个函数变得惊人。但人们经常将kqueueepoll称为用于相同的功能。但是kqueue没有单独的函数来声明对获取描述符的事件反馈感兴趣。有人知道kqueue如何以与epoll类似的方式使用吗? epoll似乎是现在最好的线程安全选项,如果它允许线程安全"兴趣声明"

1 个答案:

答案 0 :(得分:3)

来自man epoll_wait

  

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

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

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

[当然,如果您将epoll_create创建的文件描述符传递给poll()/select(),则会跟踪epoll_wait跟踪此文件描述符的修改。]