等待多个事件 C++

7

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

在线程条件下监听,例如pthread_cond_wait()

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

侦听套接字,例如accept()

如何最好地实现这一点?我需要为每个不同的输入源创建一个线程吗?谢谢


是的,这样做的原因可能是不必要的。我应该让主线程仅等待条件。一个“外部输入”线程使用select()等待套接字和文件输入。然后,子线程和“外部输入”线程都可以使用条件刺激主线程。 - user75832
4个回答

7

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


4
您可以使用系统调用select(2)来监听多个文件描述符而无需使用多个线程。您可以使用pthread_cond_timedwait等待条件变量并设置超时时间,这样您就不会等待超过特定的时间。
我认为同时等待条件变量或某种文件描述符是非常不寻常的 - 如果您确信这正是您想要做的,那么您将需要使用多个线程,其中一个线程调用pthread_cond_wait/pthread_cond_timedwait,另一个线程调用select或其他I/O函数。

11
这很不寻常,因为在Unix系统上你无法轻易地做到这一点。在win32中,这是非常普遍的,因为等待多个事件(套接字句柄、线程队列、信号量等)是易如反掌的。 - nos

4
在现代Linux中,最好的方法不是使用pthread_cond_wait。而是使用eventfd,这样可以使用select/poll/epoll监听多个事件。

0

看起来,这三种不同的消息传递选项对于单个线程来说是互斥的;在等待线程条件时,单个线程如何从标准输入读取?

如果您真的不想生成三个线程,我能想到的唯一选择就是以某种方式修改或参数化线程、流和套接字库,以便参考同步对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接