我应该如何使用epoll从同一FD读取和写入

问题描述 投票:2回答:1

环境

  • Linux x64
  • Ubuntu 16.4
  • C ++

用例

  • 异步IO(epoll)
  • 套接字用于读取和写入
  • 读取和写入操作,并且不同步,并且在套接字上迭代完成

样品流量

  1. 设置套接字(EPOLL_CTL_ADD
  2. 开始读取(EPOLL_CTL_MOD + EPOLLIN | EPOLLONESHOT
  3. 正在等待数据读取时
    • [[a]写入一些数据(EPOLL_CTL_MOD + EPOLLOUT | EPOLLONESHOT)]

问题描述

  • EPOLLIN上方的#2处注册了]
  • 在#3.a,EPOLLOUT写入完成已注册从套接字读取任何数据之前
  • 鉴于上述情况,写入完成操作@ 3.a是否会取消挂起的读取操作?
    • 换句话说,假定最初使用未设置EPOLLIN的(EPOLL_CTL_MOD + EPOLLOUT)调用FD,则将调用EPOLL_CTL_MOD + EPOLLOUT < [擦除先前注册的EPOLLIN给定数据尚未准备好读取?
  • 以上可能的解决方法

    是通过通过
  • epoll_wait

线程路由所有读/写操作来本地管理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)一个套接字用于读写操作,而不是同步的,并且在套接字上反复进行...
    c++ linux multithreading asynchronous epoll
    1个回答
    © www.soinside.com 2019 - 2024. All rights reserved.