如何使用epoll从同一个FD进行读写 环境 Linux x64 Ubuntu 16.4 C++ 用例 异步IO(epoll) 插座用于读写 读写操作,不同步,在套接字上迭代完成 样品流 安装套接字(EPOLL\u CTL\u ADD) 开始读取(EPOLL_CTL_MOD+EPOLLIN| epolonneshot) 等待读取数据时 [a]写入一些数据(EPOLL\u CTL\u MOD+epolout|epolonneshot) 问题描述 在上面的#2处注册了一个EPOLLIN读取操作 在#3.a处,在从套接字读取任何数据之前,将注册EPallout写入完成 鉴于上述情况,写入完成操作@3.a是否会取消挂起的读取操作? 换句话说,如果FD最初是用(EPOLL\U CTL\U MOD+EPOLLOUT)调用的,并且没有EPOLLIN集合,那么调用EPOLL\U CTL\U MOD+EPOLLOUTerase之前注册的EPOLLIN给定数据还没有准备好读取吗 上述问题的可能解决方法 是通过epoll_wait线程路由所有读/写操作来本地管理req IO状态,因此,不要从任意线程调用epoll_CTL_MOD,而是确保始终从执行epoll_wait的同一线程调用它,在该线程中可以安全地维护FD IO状态(EPOLOUT/EPOLLIN) 此解决方案的问题在于,它需要通过epoll_wait线程同步所有IO启动,并且会导致额外的上下文切换,这可能会对性能产生不利影响 这就是我想弄明白的:

如何使用epoll从同一个FD进行读写 环境 Linux x64 Ubuntu 16.4 C++ 用例 异步IO(epoll) 插座用于读写 读写操作,不同步,在套接字上迭代完成 样品流 安装套接字(EPOLL\u CTL\u ADD) 开始读取(EPOLL_CTL_MOD+EPOLLIN| epolonneshot) 等待读取数据时 [a]写入一些数据(EPOLL\u CTL\u MOD+epolout|epolonneshot) 问题描述 在上面的#2处注册了一个EPOLLIN读取操作 在#3.a处,在从套接字读取任何数据之前,将注册EPallout写入完成 鉴于上述情况,写入完成操作@3.a是否会取消挂起的读取操作? 换句话说,如果FD最初是用(EPOLL\U CTL\U MOD+EPOLLOUT)调用的,并且没有EPOLLIN集合,那么调用EPOLL\U CTL\U MOD+EPOLLOUTerase之前注册的EPOLLIN给定数据还没有准备好读取吗 上述问题的可能解决方法 是通过epoll_wait线程路由所有读/写操作来本地管理req IO状态,因此,不要从任意线程调用epoll_CTL_MOD,而是确保始终从执行epoll_wait的同一线程调用它,在该线程中可以安全地维护FD IO状态(EPOLOUT/EPOLLIN) 此解决方案的问题在于,它需要通过epoll_wait线程同步所有IO启动,并且会导致额外的上下文切换,这可能会对性能产生不利影响 这就是我想弄明白的:,c++,linux,multithreading,asynchronous,epoll,C++,Linux,Multithreading,Asynchronous,Epoll,是否有任何方法可以同步公共FD上的读/写IO操作,而不需要通过epoll_wait线程进行同步?有没有办法直接调用EPOLL\u CTL\u MOD,而不重置以前的状态?有什么线程安全的方法可以在已经设置了EPOLLIN的FD上添加epolout吗?SOoo…,正如@Hasturkun所建议的,使用dup来过滤EPOLLIN和epolout事件(以线程安全的方式)确实起到了作用,但是,对我来说,这看起来更像是一种破解/解决方法。。。我觉得很尴尬,没有更优雅的解决方案。。。windows IOCo

是否有任何方法可以同步公共FD上的读/写IO操作,而不需要通过epoll_wait线程进行同步?有没有办法直接调用EPOLL\u CTL\u MOD,而不重置以前的状态?有什么线程安全的方法可以在已经设置了EPOLLIN的FD上添加epolout吗?

SOoo…,正如@Hasturkun所建议的,使用
dup
来过滤EPOLLIN和epolout事件(以线程安全的方式)确实起到了作用,但是,对我来说,这看起来更像是一种破解/解决方法。。。我觉得很尴尬,没有更优雅的解决方案。。。windows IOCompletion端口在我看来更优雅…

如果您可以读取和写入两个不同的fd,您可以使用完全相同的过程读取和写入同一个fd。只需使用EPOLLIN | epolout设置一次套接字。这是真的,但是,我需要处理w种情况,例如,套接字(EPOLLIN)上有挂起的读取负载,并且在要读取到的位置没有提供缓冲区。。。这要求我以线程安全的方式管理FD状态,因为它将被多个线程访问。。。如果可能的话,我想避免这种复杂性。。。调用例如EPOLL\u CTL\u MOD+POLLEIN可以结合起来,并提供一个缓冲区,POLLEOUT也是如此。。。现在,当读取有效负载可用时,EPOLL_CTL_MOD被称为w POLLEIN | POLLEIN,但是,调用应用程序实际上只对写入数据感兴趣…有趣而且我认为相关,尽管它侧重于删除资源(以线程安全的方式),但您也可以
dup()
socket FD,这样您将有两个不同的FD,每个都有自己的事件掩码。是的,当然值得一试,我想知道我是否会在特定的FD上或在两个副本上得到epoll_wait通知。。。我们拭目以待。。。