【问题标题】:waiting for 2 different events in a single thread在单个线程中等待 2 个不同的事件
【发布时间】:2015-05-13 08:28:09
【问题描述】:

已移除 - 原因:不需要。

我的问题是:

  • 我可以使用来自两个不同线程的 linux UDP 套接字吗? 答案是 here
  • 我有两个不同的事件,我想只使用一个线程来等待。此类事件之一是将元素添加到堆栈中,另一个是套接字上数据的可用性。
    我可以将boost::condition_variable.wait(lock) 用于堆栈,将boost::asio::io_service 用于套接字。但是没有任何机制(我知道)允许我同时等待两个事件(轮询是不可能的)。 是吗?
  • 我不知道这个问题还有其他替代解决方案吗? - 我会自己解决这个问题。

【问题讨论】:

    标签: c++ linux events sockets multithreading


    【解决方案1】:

    新答案

    但是没有机制(我是 知道)这让我等待 两个事件同时发生(轮询 是不可能的)。还是这样?

    据我所知,不是没有轮询……您需要一个线程来等待每个异步事件。您可以使用阻塞堆栈,或者像您说的那样使用 boost::condition_variable 阻塞直到堆栈上有东西。 boost::asio::io_service 对于管理 udp 套接字非常有用,但在事件处理方面实际上并没有给您任何优势。

    旧答案

    我真的不确定您要做什么...您所说的没有多大意义。我会尽力猜测您要做什么,但我建议您澄清这个问题。


    问题:

    我真的需要使用 main 线程通过 组件发送数据 一个 插座,或者我可以从 新线程? (我认为答案是否定的, 但我不确定比赛条件 在套接字上)

    答案:
    您不必使用主线程通过给定组件的套接字发送数据。现在取决于您使用的套接字库,可能会有不同的限制:您可能只能在创建套接字的同一线程上发送数据,或者您可能能够从任何线程发送数据......真的取决于您的套接字的实现。


    问题:

    如何等待这两个事件?

    答案:

    你不能在同一个线程中同时做两件事......也就是说你有两个选择:

    1. 不断轮询以查看是否发生了任一事件(在同一线程上)。
    2. 有两个线程一直阻塞,直到发生所需的事件(通常当您从套接字读取时,如果没有数据,它会阻塞)。

    鉴于您对问题的描述,尚不清楚使用boost::condition_variable 和/或boost::asio::io_service 会实现什么。也许你应该给我们一个非常简单我们可以遵循的代码示例。


    问题:

    还有其他选择吗 我不是这个问题的解决方案 知道吗?

    答案:
    那里总是有替代解决方案,但是根据当前对“问题”的描述,很难说出替代方案可能是什么。我认为您应该再次编辑问题并专注于提供非常具体的示例,也许是一些伪代码等。

    【讨论】:

    • 感谢您的回答。根据你给我的信息,我会重新考虑我的方法。
    • @João 好的,我更新了我的答案......你在正确的轨道上。只需将您的套接字和事件等待拆分为单独的线程,就可以了。
    【解决方案2】:

    切换到 Windows 并使用 WaitForMultipleObjects,或者在 Linux 中实现此功能。非常方便,然后你可以在同一个线程上做两件事。

    【讨论】:

      猜你喜欢
      • 2020-10-04
      • 2015-04-24
      • 2011-07-21
      • 1970-01-01
      • 2021-03-07
      • 2020-03-04
      • 2011-12-28
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多