如果我想从一个与运行服务器使用相同服务器套接字的另一个线程中调用closesocket()关闭服务器套接字,这样做是否安全?
如果我想从一个与运行服务器使用相同服务器套接字的另一个线程中调用closesocket()关闭服务器套接字,这样做是否安全?
这个调用本身是线程安全的,但实践起来并非如此。每当您要释放一个资源且该资源的标识符在被释放后可能会被重复使用时,您必须与所有可能使用它的线程同步。否则,在资源被释放后,可能会分配一个具有相同标识符(套接字号码)的新资源(在您的情况下为套接字),并且意图访问(现在关闭的)服务器套接字的代码可能会在不同的套接字上运行。
这种情况的危险程度(以及是否可能发生)取决于您的代码。如果在关闭服务器套接字后从未创建任何其他套接字,则可能不会发生这种情况。但从概念上讲,这仍然是非常错误的,任何熟练的代码审查人员都会认为这是非常糟糕的。
编辑: 解决这类问题的方法是使用读写锁(rwlock)保护资源描述符(而不是资源本身)。访问资源描述符(在您的情况下是持有套接字号码的整数变量)需要持有"读"锁定,无论您将执行输入、输出还是使用它引用的资源进行其他操作。释放资源并在保存描述符的变量中存储类似于-1的哨兵值需要写锁定。
recv
调用,会发生什么? - chacham15没问题。当然,在其他线程中有对套接字的调用未完成时,可能会生成异常/错误,但网络堆栈本身(由于通常使用它的所有不同进程/线程都必须是线程安全的)不会受到损坏。