环境
用例
- 异步IO(epoll)
- 套接字用于读取和写入
- 读取和写入操作,并且不同步,并且在套接字上迭代完成
样品流量
- 设置套接字(EPOLL_CTL_ADD)
- 开始读取(EPOLL_CTL_MOD + EPOLLIN | EPOLLONESHOT)
- 正在等待数据读取时
- [[a]写入一些数据(EPOLL_CTL_MOD + EPOLLOUT | EPOLLONESHOT)]
问题描述
- 在EPOLLIN上方的#2处注册了]
- 在#3.a,EPOLLOUT写入完成已注册从套接字读取任何数据之前
- 鉴于上述情况,写入完成操作@ 3.a是否会取消挂起的读取操作?
- 换句话说,假定最初使用未设置EPOLLIN的(EPOLL_CTL_MOD + EPOLLOUT)调用FD,则将调用EPOLL_CTL_MOD + EPOLLOUT < [擦除先前注册的EPOLLIN给定数据尚未准备好读取?
以上可能的解决方法
线程路由所有读/写操作来本地管理req IO状态,因此,而不是从任意线程中调用
EPOLL_CTL_MOD,请确保始终从以下位置调用它:使用
epoll_wait的同一线程,可以安全地维护FD IO状态(
EPOLLOUT / EPOLLIN)。
此解决方法的问题是它要求通过epoll_wait线程来同步所有IO启动,并且会导致额外的上下文切换,这可能会对性能产生不利影响...这就是我要找出的:是否有任何方法可以通过
epoll_wait线程同步通用FD上的读/写IO操作,而不需要同步?有没有直接调用EPOLL_CTL_MOD而不重置先前状态的方法?是否在已经设置了[[EPOLLIN
的FD上添加
EPOLLOUT的任何线程安全方式?
[环境Linux x64 Ubuntu 16.4 C ++用例异步IO(epoll)一个套接字用于读写操作,而不是同步的,并且在套接字上反复进行...