C++ 等待多个事件C++;

C++ 等待多个事件C++;,c++,multithreading,posix,pthreads,C++,Multithreading,Posix,Pthreads,是否有建议的方法等待多个输入。例如,我希望我的程序能够从3个来源接收输入: 侦听线程条件,例如pthread_cond_wait() 从标准输入获取数据,例如getline() 在套接字上侦听,例如,accept() 实现这一目标的最佳方式是什么?每个不同的输入源是否需要一个线程?谢谢这三种不同的消息传递选项在一个线程中似乎是互斥的;在等待线程条件时,单个线程如何从stdin读取数据 如果您真的不想产生三个线程,那么我唯一能理解的选项就是以某种方式修改或参数化线程、流和套接字库,以引用同步对象。

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

侦听线程条件,例如pthread_cond_wait()

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

在套接字上侦听,例如,accept()


实现这一目标的最佳方式是什么?每个不同的输入源是否需要一个线程?谢谢

这三种不同的消息传递选项在一个线程中似乎是互斥的;在等待线程条件时,单个线程如何从stdin读取数据


如果您真的不想产生三个线程,那么我唯一能理解的选项就是以某种方式修改或参数化线程、流和套接字库,以引用同步对象。

您可以侦听多个文件描述符,而无需使用系统调用使用多个线程。您可以使用来等待具有超时的条件变量,以便等待的时间不会超过特定的时间量


我认为想要同时等待条件变量或某种文件描述符是非常不寻常的——如果您完全确定这就是您想要做的,那么您将必须使用多个线程,其中一个线程调用
pthread\u cond\u wait
/
pthread\u cond\u timedwait
,另一个线程调用
select
或其他一些I/O函数。

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

在现代Linux上,最好的方法是根本不使用
pthread\u cond\u wait
。只需使用,这将使您能够使用select/poll/epoll监听多个事件。

是的,这样做的原因可能是不必要的。我应该让主线程仅在条件下等待。使用select()等待套接字和文件输入的“外部输入”线程。然后,子线程和“外部输入”线程都可以使用该条件刺激主线程。这是不寻常的,因为你不能(轻松地)在Unix上这样做。它在win32中非常常见,在win32中,等待多个事件(套接字句柄、线程队列、信号量等等)是一件不需要动脑筋的事情。