首页 > 解决方案 > sendto() 在 select() 上被阻塞

问题描述

sendto()当主线程被select()同一个套接字阻塞以检查可读性时,我可以从套接字上的其他线程调用吗?这种行为是否在不同的系统(如 linux 或 windows)中定义?或者我是否必须始终仅从单个相同线程执行与套接字相关的事情( select()// )?sendto()recvfrom()

标签: c++clinuxsocketswinsock2

解决方案


我在我的应用程序中使用这种架构。我已经检查了多个来源(对于 Linux)并且没有发现任何反对它的东西。

证明这个概念的唯一正式基础是 POSIX 标准——它说线程安全函数sendto()也是如此:select()

POSIX.1-2001 和 POSIX.1-2008 要求标准中规定的所有函数都应是线程安全的,但以下函数除外

sendtoselect列出)来自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


推荐阅读