在辅助线程中调用select()/pselect()会导致主线程阻止吗?
-
12-10-2019 - |
题
我有一个正在处理的应用程序,需要几个辅助线程,每个线程将负责多个文件处理(至少1个,超过10个)。该文件的句柄没有在线程之间共享,因此我不必担心一个次要线程在另一个线程中封锁另一个 select
查看准备读/写的内容。我要确定的是,两个辅助线程都不会导致主线程在 select
/pselect
呼叫正在执行。
我想这不是问题 - 有人会想像一个网络服务器会做这些事情 - 但是当我谷歌搜索时,我找不到任何专门说“是的,您可以这样做”的东西。我假设这不会引起任何问题,我是否正确?
为了澄清,我看起来像:
执行主线(
select()
循环处理传入命令消息和发出的响应)辅助线程#1(
select()
提供服务的循环)辅助线程#2(
select()
循环提供另一个服务)
正如我之前提到的那样,在线程之间没有共享文件处理 - 它们是在单个线程中创建,使用和破坏的,而其他线程对其存在一无所知。
解决方案
不,您不必担心它们阻止主线程。我已经在各个项目中的多个线程中使用了选择。只要它们具有独特的FDSET,您就可以了,每个人都可以像独立的事件循环一样使用。
其他提示
选择不应该阻止整个过程吗?您是否尝试在插座上设置非块模式?
另外,请参阅Select_tut manpage以便一些帮助。
这是来自 select_tut
manpage:
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.