如果我想从1个线程调用服务器套接字上的closesocket(),它是否与使用相同服务器套接字运行服务器的另一个线程分开,是否安全?
答案 0 :(得分:5)
调用本身是线程安全的,但实践并非如此。每当您释放一个资源,该资源的标识符可以在解除分配后重用,您必须与可能使用它的所有线程同步。否则,它可能是,资源被释放后,一个新的资源(在你的情况,插座)可以具有相同标识符(插槽数)分配和代码打算访问(现已关闭)服务器插座可能最终运行在另一个插座上。
这种危险程度(以及它是否可能发生)在很大程度上取决于您的代码。如果在关闭服务器套接字后再也不创建任何套接字,则可能不会发生这种情况。但它在概念上仍然是非常错误的,任何有能力审查你的代码的人都会认为这非常糟糕。
编辑:像这样的问题的解决方案是使用读写器锁(rwlock)保护资源描述符(而不是资源本身)。访问资源描述符(在您的情况下,保存套接字号的整数变量)需要在其上保持“读取”锁定,无论您是使用它所引用的资源执行输入还是输出或其他操作。释放资源(并在保存描述符的变量中存储-1的sentinel值)需要写锁定。
答案 1 :(得分:1)
是的,这不是问题。当然,在套接字上有未完成调用的其他线程中会产生异常/错误,但是网络堆栈本身(由于通常使用它的所有不同进程/线程,它必须是线程安全的) ),不会被损坏。