使用 epoll_wait 来管理使用多个线程的多个连接,尝试释放与关闭的套接字关联的自定义数据存在风险。
考虑以下场景,其中 T 是自定义数据:
- 收到数据,
- 因为1,线程A从epoll_wait解除阻塞,处理事件(访问T)
- 同时,另一个线程B,想要关闭连接
线程 B 不能假设 T 可以安全地删除,即使调用 close 会立即从 epoll 中删除套接字。
我有以下标准想法:
在 T 中维护一个变量,该变量在每次调用 write/read 返回 EAGAIN 时递增,并在每次套接字准备好时递减。调用 close 时,在删除 T 之前等待该变量降至零。我遇到的问题是,如果调用 close,epoll_wait 不会返回取消先前调用以武装套接字的指示。
有人有同样的问题吗?你是如何克服它的?