2009-05-27 134 views
5

是否有推荐的方法来等待多个输入。例如,我希望我的程序能够接收3个来源的输入:等待多个事件C++

听线程条件例如pthread_cond_wait()

从标准输入获取数据例如, getline()

在插座上聆听例如accept()

完成此操作的最佳方法是什么?我是否需要针对每个不同输入源的线程?谢谢

+0

是的原因可能是不必要的。我应该让主线程等待条件。使用select()等待套接字和文件输入的“外部输入”线程。然后,子线程和“外部输入”线程可以使用该条件激励主线程。 – 2009-05-27 16:25:49

回答

4

您可以使用select(2)系统调用在多个文件描述符上收听而不使用多个线程。您可以使用pthread_cond_timedwait等待带有超时的条件变量,以便您不会等待超过特定的时间量。

我认为想要同时等待条件变量或某种文件描述符是非常不寻常的 - 如果您确信这就是您想要做的,那么您将不得不使用多个线程,其中一个线程调用pthread_cond_wait/pthread_cond_timedwait,另一个线程调用select或其他一些I/O函数。

+8

这只是不寻常的,因为你不能在unix上这么做(很容易)。这在win32中很常见,在这里等待多件事情(套接字句柄,线程队列,信号量,whatnot)是一件容易的事情。 – nos 2009-07-19 02:22:13

0

它似乎好像这三个不同的消息传递选项是相互排斥的单线程;单线程在等待线程条件时如何从标准输入读取数据?

如果你真的不想产生三个线程,我唯一能找到的选择是以某种方式修改或参数化线程,流和套接字库以引用同步对象。

7

不需要单独的线程等待accept(2)stdin - 在这里使用poll/select。在线程之间创建一个管道(如果我们谈论CV,则已经有线程),请在相同的poll上等待,并在事件发生时写入。

3

在现代Linux上,最好的方法是不要使用pthread_cond_wait。只需使用eventfd,这将使您能够使用select/poll/epoll监听多个事件。