【问题标题】:Waiting on multiple events C++等待多个事件 C++
【发布时间】:2009-05-27 15:53:35
【问题描述】:

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

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

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

监听一个套接字,例如接受()

完成此任务的最佳方法是什么?每个不同的输入源都需要一个线程吗?谢谢

【问题讨论】:

  • 是的,原因可能是不必要的。我应该让主线程只等待条件。使用 select() 来等待套接字和文件输入的“外部输入”线程。然后子线程和“外部输入”线程都可以使用条件来刺激主线程。

标签: c++ multithreading posix pthreads


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这很不寻常,因为你不能(轻松地)在 unix 上做到这一点。这在 win32 中很常见,等待多个事物(套接字句柄、线程队列、信号量、诸如此类)是轻而易举的事。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-08-31
        • 1970-01-01
        • 2019-08-26
        • 1970-01-01
        • 2011-07-21
        • 2015-04-24
        • 1970-01-01
        • 2020-10-04
        • 1970-01-01
        相关资源
        最近更新 更多