[英]How to exit a blocking call of recv() on a thread from a different thread?
[英]Blocking recv doesn't exit when closing socket from another thread?
在Linux中,如果我们从一个线程调用阻塞recv
并从另一个线程关闭同一个套接字,则recv
不会退出。
为什么?
“为什么”只是它的设计方式。
在内核中, recv()
调用在与struct file
对应的struct file
上调用了fget()
,这将阻止它在相应的fput()
之前被释放。
你只需要改变你的设计(无论如何你的设计都是天生的 - 为了实现这一点,你必须没有锁定保护用户空间中的文件描述符,这意味着close()
可能发生在 recv()
调用之前 - 文件描述符甚至被重用于其他东西)。
如果你想唤醒另一个在文件描述符上阻塞的线程,你应该让它在select()
上阻塞,而是在主线程可以写入的文件描述符集中包含一个管道。
检查套接字的所有文件描述符是否已关闭。 如果在“远程端”仍然打开(假设这是您尝试关闭的那个),则“ 对等体未执行有序关闭 ”。
如果仍然无效,请在远程端调用shutdown(sock, SHUT_RDWR)
,无论引用计数如何,都将关闭套接字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.