【问题标题】:epoll - is EPOLLET prone to race conditions?epoll - EPOLLET 容易出现竞争条件吗?
【发布时间】:2014-04-23 06:05:39
【问题描述】:
  1. 管道上的进程 B epoll (EPOLLIN|EPOLLET)。
  2. 进程 A 在管道中写入 1KiB。
  3. 进程 B 唤醒。
  4. 进程 B 从管道中读取 1KiB。
  5. 进程 A 在管道中写入 1KiB。
  6. 管道上的进程 B epoll。

管道的状态在 epoll 期间没有改变,但自上次读取后发生了变化。进程 B 会再次唤醒吗?

【问题讨论】:

    标签: linux sockets epoll epollet


    【解决方案1】:

    我从http://linux.die.net/man/4/epoll的FAQ(Q9)的理解是,你会在第6步得到另一个事件(假设你可以保证第5步真的发生在第4步之后并且管道在第4步之后是空的)。

    话虽如此,您可能会得到比保证更多的事件(但您必须小心仅依赖记录在案的行为) - 请参阅 http://cmeerw.org/blog/753.html#753 和 http://cmeerw.org/blog/750.html#750

    【讨论】:

    • 我一直读到 E{AGAIN,WOULDBLOCK} 所以是的,我知道 5 发生在 6 之后。
    【解决方案2】:

    虽然内核确实在第 6 步唤醒,但手册页中并未记录。您提供的用例不符合 EPOLLET 的使用方式。

    根据文档,第 6 步应该是“从 FD 读取”。您应该从 FD 进行轮询的唯一时间是在您尝试阅读并获得 EAGAIN 之后。

    另请参阅:What is the use case for EPOLLET?

    【讨论】:

      猜你喜欢
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多