gpt4 book ai didi

c - 从另一个线程关闭套接字时,阻塞 recv 不会退出?

转载 作者:太空狗 更新时间:2023-10-29 15:11:08 26 4
gpt4 key购买 nike

在 Linux 中,如果我们从一个线程调用阻塞 recv 并从另一个线程关闭同一个套接字,recv 不会退出。

为什么?

最佳答案

“原因”很简单,这就是它的设计方式。

在内核中,recv() 调用在与文件描述符对应的 struct file 上调用了 fget(),而这将阻止它在相应的 fput() 之前被释放。

你只需要改变你的设计(无论如何你的设计本质上是活泼的 - 为此,你必须没有锁定保护用户空间中的文件描述符,这意味着 close()可能发生在 recv() 调用之前 - 文件描述符甚至被重用于其他用途)。


如果你想唤醒另一个阻塞在文件描述符上的线程,你应该让它阻塞在 select() 上,文件描述符集中包含一个可以写入的管道通过主线程。

关于c - 从另一个线程关闭套接字时,阻塞 recv 不会退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3624365/

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