同一个FD应该如何使用epoll读写
How should I use epoll to read and write from the same FD
环境
- Linuxx64
- Ubuntu 16.4
- C++
用例
- 异步 IO ( epoll )
- 一个socket同时用于读写
- 读写操作不同步,在套接字上迭代完成
示例流程
- 设置套接字(EPOLL_CTL_ADD)
- 开始阅读(EPOLL_CTL_MOD + EPOLLIN | EPOLLONESHOT)
- 等待数据读取时
- [a] 写入一些数据 (EPOLL_CTL_MOD + EPOLLOUT | EPOLLONESHOT)
问题描述
- 在上面的#2 处注册了一个 EPOLLIN 读操作
- 在#3.a,EPOLLOUT写入完成被注册在从套接字读取任何数据之前
- 鉴于以上,写完成操作@3.a是否会取消挂起的读操作?
- 换句话说,假设 FD 最初是用 (EPOLL_CTL_MOD + EPOLLOUT) 调用的,没有 EPOLLIN设置,会调用EPOLL_CTL_MOD + EPOLLOUT erase 先前注册的 EPOLLIN 给定数据尚未准备好读取 ??
上述问题的可能解决方法
- 是通过 epoll_wait 线程路由所有 read/write 操作来本地管理 req IO 状态,因此,而不是调用 EPOLL_CTL_MOD 来自任意线程,确保总是从执行 epoll_wait 的同一个线程调用 FD IO 状态(EPOLLOUT/EPOLLIN)可以安全维护了。
- 此解决方法的问题是它需要通过 epoll_wait 线程同步所有 IO 启动,并且会导致额外的上下文切换,这可能会产生不利影响性能...
这就是我想弄清楚的:
有什么方法可以同步普通FD上的Read/Write IO操作w/o需要通过epoll_wait线程同步?有没有办法直接调用EPOLL_CTL_MODw/o重置之前的状态?在已经设置了 EPOLLIN 的 FD 上是否有任何 线程安全方式 添加 EPOLLOUT ?
SOoo...,正如@Hasturkun 所建议的那样,使用 dup
来过滤 EPOLLIN 和 EPOLLOUT 事件(以线程安全的方式)做到了这一点,但是,对我来说,这看起来更像是 hack / 解决方法...我发现没有更优雅的解决方案很尴尬...windows IOCompletion 端口对我来说似乎更优雅...
环境
- Linuxx64
- Ubuntu 16.4
- C++
用例
- 异步 IO ( epoll )
- 一个socket同时用于读写
- 读写操作不同步,在套接字上迭代完成
示例流程
- 设置套接字(EPOLL_CTL_ADD)
- 开始阅读(EPOLL_CTL_MOD + EPOLLIN | EPOLLONESHOT)
- 等待数据读取时
- [a] 写入一些数据 (EPOLL_CTL_MOD + EPOLLOUT | EPOLLONESHOT)
问题描述
- 在上面的#2 处注册了一个 EPOLLIN 读操作
- 在#3.a,EPOLLOUT写入完成被注册在从套接字读取任何数据之前
- 鉴于以上,写完成操作@3.a是否会取消挂起的读操作?
- 换句话说,假设 FD 最初是用 (EPOLL_CTL_MOD + EPOLLOUT) 调用的,没有 EPOLLIN设置,会调用EPOLL_CTL_MOD + EPOLLOUT erase 先前注册的 EPOLLIN 给定数据尚未准备好读取 ??
上述问题的可能解决方法
- 是通过 epoll_wait 线程路由所有 read/write 操作来本地管理 req IO 状态,因此,而不是调用 EPOLL_CTL_MOD 来自任意线程,确保总是从执行 epoll_wait 的同一个线程调用 FD IO 状态(EPOLLOUT/EPOLLIN)可以安全维护了。
- 此解决方法的问题是它需要通过 epoll_wait 线程同步所有 IO 启动,并且会导致额外的上下文切换,这可能会产生不利影响性能...
这就是我想弄清楚的:
有什么方法可以同步普通FD上的Read/Write IO操作w/o需要通过epoll_wait线程同步?有没有办法直接调用EPOLL_CTL_MODw/o重置之前的状态?在已经设置了 EPOLLIN 的 FD 上是否有任何 线程安全方式 添加 EPOLLOUT ?
SOoo...,正如@Hasturkun 所建议的那样,使用 dup
来过滤 EPOLLIN 和 EPOLLOUT 事件(以线程安全的方式)做到了这一点,但是,对我来说,这看起来更像是 hack / 解决方法...我发现没有更优雅的解决方案很尴尬...windows IOCompletion 端口对我来说似乎更优雅...