你如何优雅地在可以在另一个线程上关闭的套接字上选择()?

mpo*_*llo 2 c sockets

我有一个线程在由单独线程管理的套接字上选择的情况。

当一个套接字关闭时,select()大概会将该套接字返回为“可用”,直到我尝试从中读取它,我才意识到它已关闭。

但我看到了一个悖论:当套接字从另一个线程关闭时,系统可以自由地为其他目的重新分配其文件描述符。(我认为。)

我怎样才能保证当我从套接字(只是一个数字描述符)读取时,系统还没有回收该描述符并将其用于新的套接字?换句话说,据我所知,我可能正在从最近打开的其他一些套接字(也许我什至不应该包括在我的套接字中select()!)而不是刚刚关闭的套接字读取。

我可以保留最近关闭的描述符列表,但我想知道是否有更好的方法。

BRP*_*ock 5

简短的回答:不要从另一个线程关闭套接字,您正在从这个线程中读取它!

FD 可能会被重新分配。但是,如果您在多个线程中从一个 FD 读取而没有某种方案在它们之间进行通信,则会遇到问题。现在,如果你在共享内存中有一个“套接字描述”结构,它有一个控制信号量和一些 FD 的指示,以及其他状态信息,也许这是可以管理的,但我想你会发现最简单的解决方案几乎是总是使 FD 特定于单个线程......