gpt4 book ai didi

linux - 处理由 epoll 管理的套接字关闭的安全方法

转载 作者:太空狗 更新时间:2023-10-29 11:38:44 24 4
gpt4 key购买 nike

使用 epoll_wait 来管理使用多个线程的多个连接,尝试释放与已关闭套接字关联的自定义数据存在风险。

考虑以下场景,其中 T 是自定义数据:

  1. 收到数据,
  2. 由于1,线程A从epoll_wait中deblock并处理事件(访问T)
  3. 同时,另一个线程B,想要关闭连接

线程 B 不能假设 T 可以被安全删除,即使关闭调用会立即从 epoll 中删除套接字。

我有以下标准想法:

在 T 中维护一个变量,每次对写/读的调用返回 EAGAIN 时该变量都会递增,并在每次套接字准备就绪时递减。调用 close 时,等待该变量降为零,然后再删除 T。我遇到的问题是,如果调用 close,epoll_wait 不会返回取消先前调用以武装套接字的指示。

有人遇到过同样的问题吗?你是如何克服它的?

最佳答案

这里至少有三种可能的方式:

  • 不使用线程,简单明了,通常有效。

  • 让专用线程执行所有文件描述符轮询并将事件发布到执行实际 I/O 和处理的工作线程池。

  • 有一个epoll(7)每个线程的实例,因此线程管理不相交的描述符集,除了可能用于填充这些集的监听套接字和一些控制机制,如 eventfd(2) , 或自 pipe(2)能够干净地关闭整个钻机。

希望这对您有所帮助。

关于linux - 处理由 epoll 管理的套接字关闭的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13808346/

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