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

时间:2010-12-21 22:02:59

标签: c io pthreads multiplexing

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

我认为这不是一个问题 - 人们可以想象这样的事情会在网络服务器上完成 - 但我找不到任何具体的说法“是的,你可以这样做”当我谷歌搜索。我是否认为这不会导致任何问题?

为了澄清,我看起来像是:

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

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

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

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

2 个答案:

答案 0 :(得分:5)

不,你不必担心他们阻止主线程。我在各种项目中使用了多个线程中的select。只要他们有不同的FDSETS,那么你很好,每个人都可以像独立的事件循环一样使用。

答案 1 :(得分: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.