如果我想从一个线程调用服务器套接字上的closesocket() (),而这个线程与使用相同服务器套接字运行服务器的另一个线程是分开的,这样做安全吗?
发布于 2012-03-26 00:07:18
调用本身是线程安全的,但实践并非如此。每当您释放一个资源时,您必须与所有可能使用它的线程进行同步。否则,在释放资源之后,可能会使用相同的标识符(套接字编号)分配一个新资源(在您的例子中是套接字),而打算访问(现已关闭)服务器套接字的代码最终可能会在不同的套接字上运行。
这种情况的危险程度(以及它是否会发生)在很大程度上取决于您的代码。如果在关闭服务器套接字后再也不创建套接字,则可能不会发生这种情况。但它在概念上仍然是非常错误的,任何有能力审查你的代码的人都会认为这是非常糟糕的。
编辑:此类问题的解决方案是使用读-写器锁(rwlock)保护资源描述符(而不是资源本身)。访问资源描述符(在本例中,是保存套接字编号的整数变量)需要持有一个“读”锁,无论您是要执行输入或输出,还是使用它所引用的资源进行其他操作。释放资源(并在保存描述符的变量中存储像-1这样的标记值)需要写锁。
发布于 2012-03-25 23:12:13
是的,这不是问题。当然,在套接字上有未完成调用的其他线程中会产生异常/错误,但网络堆栈本身(必须是线程安全的,因为所有不同的进程/线程通常都在使用它)不会受到破坏。
https://stackoverflow.com/questions/9861172
复制相似问题