等待C ++的多个事件

时间:2009-05-27 15:53:35

标签: c++ multithreading posix pthreads

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

收听线程条件,例如pthread_cond_wait()的

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

收听套接字,例如接受()

实现这一目标的最佳方法是什么?我是否需要为每个不同的输入源提供一个线程?感谢

4 个答案:

答案 0 :(得分:7)

无需单独的线程等待accept(2)stdin - 请在此处使用poll/select。而不是条件变量,在线程之间创建管道(如果我们谈论CV,你已经有线程),在同一个poll中等待它并在事件发生时写入它。

答案 1 :(得分:4)

您可以使用select(2)系统调用在不使用多个线程的情况下侦听多个文件描述符。您可以使用pthread_cond_timedwait等待超时的条件变量,这样您就不会等待超过特定的时间。

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

答案 2 :(得分:3)

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

答案 3 :(得分:0)

这看起来好像这三个不同的消息传递选项对于单个线程是互斥的;单个线程在等待线程条件时如何从stdin读取?

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