gpt4 book ai didi

multithreading - epoll是否有线程安全问题?

转载 作者:行者123 更新时间:2023-12-03 13:15:05 25 4
gpt4 key购买 nike

这是问题14221339的后续内容。

我有一个在epoll_wait()循环内运行的线程池。

一个外部线程调用epoll_ctl()并添加一个监听器套接字
(EPOLLET | EPOLLONESHOT | EPOLLIN)

当线程池只有一个线程时,它间歇性地无法接收到第一次(也是唯一的)连接尝试的EPOLLIN事件。如果我将线程池增加到两个,它几乎总是无法接收到EPOLLIN事件。

我的理解是epoll API是线程安全的,但是这种观察似乎表明并非如此。

最佳答案

使用边缘触发的语义,错误的调用序列可能会导致竞争状态。涉及三个系统调用:

  • epoll_ctl()激活通知(如果需要,则重新激活
    使用EPOLLONESHOT)。
  • epoll_wait()接收通知。
  • 系统输入:循环读取()/recv()/accept(),直到错误EAGAIN。

  • 如果按此顺序执行(重复),则可能在#3和#1之间发生争夺:当内核中的输入事件发生在返回EAGAIN之后但可以执行epoll_ctl()之前。通常,重新激活需要在I/O之前完成。
  • epoll_ctl()激活通知(如果需要,则重新激活
    使用EPOLLONESHOT)。
  • 系统输入:循环读取()/recv()/accept(),直到错误EAGAIN。
  • epoll_wait()接收通知。

  • (显然,I/O必须是非阻塞的。)

    关于multithreading - epoll是否有线程安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14238113/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com