作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
如果我想从 1 个线程在服务器套接字上调用 closesocket() 是否安全,该线程与使用相同服务器套接字运行服务器的另一个线程分开?
最佳答案
调用本身是线程安全的,但实践不是。每当您解除分配其标识符在解除分配后可以重用的资源时,您必须与可能使用它的所有线程同步。否则,有可能在资源被释放后,一个新的资源(在你的例子中是套接字)可以分配相同的标识符(套接字号),并且打算访问(现在关闭的)服务器套接字的代码可能最终运行在不同的套接字上。
这危险的程度(以及它是否会发生)在很大程度上取决于您的代码。如果您在关闭服务器套接字后不再创建任何套接字,则可能不会发生这种情况。但这在概念上仍然是非常错误的,任何有能力审查您的代码的人都会认为这非常糟糕。
编辑:解决此类问题的方法是使用读写锁 (rwlock) 保护资源描述符(而非资源本身)。访问资源描述符(在您的情况下是保存套接字编号的整数变量)需要对其持有“读”锁,无论您是执行输入或输出还是使用它引用的资源进行其他操作。释放资源(并在保存描述符的变量中存储一个标记值,如 -1)需要一个写锁。
关于c++ - closesocket 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9861172/
我是一名优秀的程序员,十分优秀!