3

我有一个正在处理的应用程序需要几个辅助线程,每个辅助线程将负责多个文件句柄(至少 1 个,超过 10 个)。文件句柄不在线程之间共享,因此我不必担心一个辅助线程会在select查看准备好读/写的内容时阻塞另一个线程。我要确定的是,在执行select/pselect调用时,两个辅助线程都不会导致主线程停止执行。

我想这不是问题——人们会想像这样的事情会在网络服务器中完成——但是当我用谷歌搜索时,我找不到任何特别说“是的,你可以做到这一点”的东西。我的假设是否正确,这不会引起任何问题?

为了澄清起见,我所拥有的看起来像:

  • 执行的主线程(select()循环处理传入的命令消息和传出的响应)

  • 辅助线程#1(select()提供服务的循环)

  • 辅助线程#2(select()循环提供另一个服务)

正如我之前提到的,没有一个文件句柄在线程之间共享——它们是在一个单独的线程中创建、使用和销毁的,而其他线程不知道它们的存在。

4

2 回答 2

9

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

于 2010-12-21T22:07:25.033 回答
0

选择不应该阻止整个过程吗?您是否尝试在套接字上设置非阻塞模式?

此外,请参阅 select_tut 联机帮助页以获取帮助。

这是手册页中的相关部分select_tut

So what is the point of select()? Can't I just read and write to my descriptors whenever I want? The point of select() is that it watches multiple descriptors at the same time and properly puts the process to sleep if there is no activity.

于 2010-12-21T22:06:25.907 回答