epoll - EPOLLET是否容易出现竞争条件?

时间:2014-03-17 20:17:51

标签: linux sockets epoll epollet

  1. B管道上的工艺B(EPOLLIN | EPOLLET)。
  2. 进程A在管道中写入1KiB。
  3. 流程B醒来。
  4. 流程B从管道中读取1KiB。
  5. 进程A在管道中写入1KiB。
  6. 流程B在管道上出现。
  7. 管道状态在epoll期间不会改变,但自上次读取后已发生变化。进程B会再次唤醒吗?

2 个答案:

答案 0 :(得分:1)

我对http://linux.die.net/man/4/epoll中常见问题解答(Q9)的理解是,您将在步骤6中获得另一个事件(假设您可以保证在步骤4之后确实发生了第5步,并且在步骤4之后管道为空)

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

答案 1 :(得分:1)

虽然确实在第6步唤醒了内核,但手册页中没有记录。您提供的用例与应该使用EPOLLET的方式不符。

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

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