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