c++ - sendto() 在 select() 上被阻塞
问题描述
sendto()
当主线程被select()
同一个套接字阻塞以检查可读性时,我可以从套接字上的其他线程调用吗?这种行为是否在不同的系统(如 linux 或 windows)中定义?或者我是否必须始终仅从单个相同线程执行与套接字相关的事情( select()
// )?sendto()
recvfrom()
解决方案
我在我的应用程序中使用这种架构。我已经检查了多个来源(对于 Linux)并且没有发现任何反对它的东西。
证明这个概念的唯一正式基础是 POSIX 标准——它说线程安全函数sendto()
也是如此:select()
POSIX.1-2001 和 POSIX.1-2008 要求标准中规定的所有函数都应是线程安全的,但以下函数除外
(sendto
未select
列出)来自https://linux.die.net/man/7/pthreads。
所以如果函数是线程安全的,它的内部结构是安全锁定的,那么混合这两个函数也应该没问题。但是我认为与 . 混合是不正确select()
的recvfrom()
。也许它不会破坏程序,但唤醒两个等待线程会产生竞争条件。
关于winsock,必须检查文档的实现如何遵循POSIX 标准。我唯一发现的是winsock2线程安全吗?,这部分回答了你的问题。在 Linux 中,您可以检查它的开源代码:https ://github.com/torvalds/linux/blob/master/net/socket.c https://github.com/torvalds/linux/blob/master/fs/select。丙。
更新:另一个有用的链接https://groups.google.com/forum/#!topic/comp.os.linux.networking/cLbMGRNw8EA
推荐阅读
- selenium-webdriver - 如何使用 chrome 驱动程序修复 jenkins
- php - 创建的类有错误。帮助找到它,请)
- hibernate - 关系返回 mappedBy 引用未知的目标实体属性
- css - w3.org 作者如何将视角转换为高度来测量 CSS 像素参考的尺寸?
- three.js - Object3D 子项是否可以使用父项的位置和旋转进行更新,但不能进行缩放?
- python - 如果使用 ORM,是否需要在 DB 中定义关系?
- java - 我正在尝试以带有分隔空格的特定形式输入
- mysql - SQL Server Reporting Services 未从 SQL 存储过程传递正确的参数
- python - 使用正则表达式拆分项目列表
- android - 如何知道 Speech To Text 何时完成?