You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨线程Socket错误检测:写线程关闭socket后读线程epoll_wait是否返回错误?

问题解答

当写线程关闭Socket后,读线程的epoll_wait不会直接返回错误,而是会触发该Socket的就绪事件,具体行为分两种情况:

  • 若Socket被正常关闭(比如调用close()),epoll_wait会返回该Socket的EPOLLIN事件,此时读线程调用recv()会返回0,代表连接已关闭。
  • 若Socket因错误被关闭(比如写操作触发EPIPE等错误后关闭),epoll_wait可能返回EPOLLERR或EPOLLHUP事件,此时读线程调用recv()会返回-1,同时errno会被设置为对应错误码(比如EBADF表示文件描述符已失效,ECONNRESET表示连接被重置)。

需要注意的是,Socket关闭后其文件描述符会失效,后续对它的操作都会触发错误,但epoll_wait本身不会报错,而是把这个失效的Socket标记为就绪状态,让你去处理它。另外多线程操作同一Socket时,建议通过互斥锁、条件变量等同步机制避免竞态条件,确保读线程能及时感知Socket已关闭。


内容的提问来源于stack exchange,提问作者user180574

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:27:00