跨线程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
相关产品推荐
相关产品推荐

