我有这样一种情况,线程正在选择由单独线程管理的套接字。
当一个套接字关闭时,select()
大概会将该套接字返回为“可用”,直到我尝试读取它时我才意识到它已关闭。
但我看到了一个悖论:当套接字从另一个线程关闭时,系统可以自由地重新分配其文件描述符以用于其他目的。 (我认为。)
我如何保证在我从套接字(只是一个数字描述符)读取时系统尚未回收该描述符并将其用于新套接字?换句话说,据我所知,我可能正在从最近打开的一些其他套接字(也许我什至不应该包括在我的 select()
中的套接字!)而不是刚刚打开的套接字读取-关闭套接字。
我可以保留最近关闭的描述符列表,但我想知道是否有更好的方法。
最佳答案
简短的回答:不要关闭您正在阅读的另一个线程的套接字!
FD 可能会被重新分配。但是如果您在多个线程中从一个 FD 读取而没有某种方案在它们之间进行通信,您将会遇到问题。现在,如果你在共享内存中有一个“套接字描述”结构,它有一个控制信号量和 FD 的一些指示,以及其他状态信息,也许这是可以管理的,但我认为你会发现最简单的解决方案几乎是始终使 FD 特定于单个线程……
关于c - 您如何在可以在另一个线程上关闭的套接字上优雅地选择()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8480381/