epoll或kqueue是否可以处理向其自身异步添加文件描述符
Can epoll or kqueue handle asynchronous additions of file descriptors to itself
如果一个线程(比如X)正在等待epoll_wait()
,那么另一个线程可以调用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
允许线程安全的"兴趣声明",那么它似乎是目前最好的线程安全选项
来自man epoll_wait:
当一个线程在调用epoll_pwait()时被阻塞时,另一个线程可以向等待的epoll实例添加文件描述符。如果新的文件描述符准备就绪,它将导致epoll_wait()调用取消阻止。
因此,epoll_wait
在等待时监视添加的文件描述符。
poll()/select()无法实现这种行为,因为它们读取一次文件描述符集,因此无法修改当前轮询的文件描述符集。
[当然,如果您将epoll_create
创建的文件描述符传递给poll()/select()
,则会像epoll_wait
一样跟踪此文件描述符的修改。]
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 只能向C++添加一定数量的字符
- Qt和C++:将QLineEdit添加到QTabWidget中
- 将QIcon添加到QTableView单元格
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 如何将异步计时器添加到Boost UDP服务器中
- epoll或kqueue是否可以处理向其自身异步添加文件描述符