在次要线程中调用select()/pselect()会导致主线程阻塞吗?

3
我有一个应用程序需要几个辅助线程,每个线程将负责一些文件句柄(至少1个,最多10个)。文件句柄在线程之间不共享,因此我不必担心一个辅助线程在select哪些内容可以读/写时阻塞另一个线程。我想要确保的是,在执行select/pselect调用时,两个辅助线程都不会导致主线程停止执行。
我认为这不是问题——在Web服务器等地方可能会这样做——但我在谷歌上找不到任何明确说明“是的,你可以这样做”的东西。我的假设是正确的吗?
为了澄清,我的情况大致如下:
- 执行的主线程(select()循环处理传入的命令消息和传出的响应) - 辅助线程#1(select()循环提供服务) - 辅助线程#2(select()循环提供另一个服务)
正如我之前提到的,这些文件句柄没有在线程之间共享——它们在单个线程中创建、使用和销毁,并且其他线程不知道它们的存在。
2个回答

9

不用担心它们会阻塞主线程。我在多个项目中使用了select函数,并在各个线程中使用。只要它们有不同的FDSETS,你就没问题了,每个线程都可以像独立的事件循环一样使用。


那正是我所想的,但select手册中提到它会在等待文件描述符准备好(或超时)时阻塞进程。这就是为什么我想知道这是否字面意义上的(进程被阻塞),还是仅指当前执行线程。 - Will
1
@Will 顺便提一下,确认文件描述符不同即可。 - chrisaycock
3
这是select命令的正确“man page”页面链接:http://pubs.opengroup.org/onlinepubs/9699919799/functions/select.html。在该页面中,除了更改历史部分外,不会发现任何有关“process”的提及。在许多系统上(如Linux),您可以安装POSIX man pages,它们将显示为man3p节。这非常有帮助,因为供应商的man pages往往包含误导性信息。 - R.. GitHub STOP HELPING ICE
@R:+1 感谢。我讨厌那些令人困惑/误导的文档。 - Will

0

select不应该阻止整个进程吗? 你尝试在套接字上设置非阻塞模式了吗?

此外,可以参考一下 select_tut 的man页获得帮助。

以下是来自select_tut man页的相关部分:

那么select()有什么意义呢?我不能随时读写我的描述符吗? select()的意义在于同时监视多个描述符,并在没有活动时正确地使进程进入睡眠状态。


套接字是非阻塞的。我在select man页中读到了一些内容,它会阻止进程,这就是促使我提出问题的原因。 - Will
谁把那么多错误信息打包成一个男性命令页面的教程? - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接