【发布时间】:2016-04-06 07:35:34
【问题描述】:
如果一个线程(比如 X)正在等待 epoll_wait(),另一个线程(比如 Y)可以调用 epoll_ctl() 以注册对文件描述符 9 的兴趣。之前在线程X中对epoll_wait()的调用能否返回线程Y添加的文件描述符9?对epoll_wait() 的初始调用在任何时候都不会在中间返回。
现在我想对此进行比较,并就操作系统中的另外两个轮询调用提出相关问题。 poll() 和 kqueue
- 如果上述问题的答案是正确的,那么有没有办法通过
poll()系统调用实现类似的行为? - 让我们假设
epoll_ctl()是线程安全的,线程X 可以安全地调用epoll_ctl()并让epoll_wait()的调用返回文件描述符9是否准备好进行I/O。声明对文件描述符感兴趣的函数和等待函数的分离是使这个函数令人惊叹的原因。但是人们经常将kqueue和epoll称为用于相同的功能。但是kqueue没有单独的函数来声明对获取描述符的事件反馈感兴趣。有人知道kqueue可以以与epoll类似的方式使用吗?epoll似乎是目前最好的线程安全选项,如果它允许线程安全“利益声明”
【问题讨论】:
-
使用
kqueue,您可以通过将 0 作为nevents参数传递来声明兴趣而无需获得事件反馈。参见,例如,this answer
标签: c++ multithreading sockets epoll kqueue