【问题标题】:Is epoll thread-safe?epoll 线程安全吗?
【发布时间】:2011-10-26 21:19:27
【问题描述】:

epoll中有两个函数:

  1. epoll_ctl
  2. epoll_wait

当我使用相同的 epoll_fd 时,它们是否线程安全
如果一个线程调用epoll_wait,其他线程同时调用epoll_ctl,会发生什么?

【问题讨论】:

  • 你用的是同一个epoll_fd吗?
  • 是的,我用的是同一个epoll_fd。
  • 您能否详细说明您的使用情况?为什么一定要使用同一个epoll fd?如果你在做 RX/TX 结构,你可以让一个 epoll fd 对应于 IN 事件,一个对应于 out 事件(这是我在一些应用程序中使用的)
  • 你好,我用epll io多路复用和线程池,我想用epoll_ctl改变其他线程上的事件。但是不知道是否需要使用一些同步机制来保证线程安全。

标签: c multithreading sockets network-programming epoll


【解决方案1】:

它是线程安全的,但没有太多文档明确说明这一点。见here

顺便说一句,您也可以让多个线程在单个 epoll_fd 上等待,但在这种情况下可能会有点棘手。 (即,您可能希望使用边缘触发 EPOLLET 或 oneshot 模式 EPOLLONESHOT。请参阅 here。)

【讨论】:

    【解决方案2】:

    注意:现有接受的answer 是正确的,但它提到“没有太多文档明确说明”,而 epoll 文档确实说明了。

    epoll_waitmanual page 明确允许在另一个线程中等待时将文件描述符添加到 epoll 集中:

    “注释”部分:

    虽然一个线程在调用 epoll_wait() 时被阻塞,但有可能 让另一个线程将文件描述符添加到等待的 epoll 实例。如果新的文件描述符准备好,它将导致 epoll_wait() 调用解除阻塞。

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2011-07-04
      • 2014-04-26
      • 2012-11-30
      • 2010-12-30
      • 2013-03-12
      • 2021-08-03
      • 2010-12-27
      • 2018-06-04
      相关资源
      最近更新 更多