closesocket线程安全吗?

如果我想从一个线程调用服务器套接字上的closesocket(),这与另一个使用相同服务器套接字运行服务器的线程是分开的,那么安全吗?

Solutions Collecting From Web of "closesocket线程安全吗?"

这个调用本身是线程安全的,但这种做法不是。 每当你释放一个资源的标识符可以在解除分配后重用时,你必须同步所有可能使用它的线程。 否则,可能在资源被释放后,一个新的资源(在你的情况下,套接字)可以被分配相同的标识符(套接字号),并且打算访问(现在关闭的)服务器套接字的代码可能最终运行在不同的插座上。

这是危险的程度(以及它是否可以发生)取决于您的代码。 如果在关闭服务器套接字之后从不再创建任何套接字,则可能不会发生这种情况。 但是它在概念上仍然是非常错误的,任何有能力审查你的代码的人都会认为这很糟糕。

编辑:像这样的问题的解决方案是用读写器锁(rwlock)保护资源描述符(而不是资源本身)。 访问资源描述符(在你的情况下,持有套接字号的整型变量)需要持有一个“读取”锁,无论你是使用它引用的资源执行输入或输出或其他操作。 取消分配资源(并在保存描述符的变量中存储一个类似于-1的标记值)需要写入锁定。

是的,这不是问题。 当然,在其他线程中会产生异常/错误,这些线程在套接字上有未完成的调用,但是网络堆栈本身(由于通常使用它的所有不同的进程/线程必须是线程安全的),不会被损坏。