在一个线程中等待2个不同的事件

时间:2010-05-14 17:08:49

标签: c++ linux events sockets multithreading

删除 - 理由:不是真的需要。

我的问题是:

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

2 个答案:

答案 0 :(得分:1)

新答案

  

但是没有机制(我是   意识到)让我等待   两个事件同时进行(民意调查   是不可能的。或者是吗?

不是我知道的,并且不是没有轮询......你需要一个线程来等待每个异步事件。您可以使用阻塞堆栈或类似于您所说的使用boost::condition_variable阻塞,直到堆栈上有东西为止。 boost::asio::io_service对于管理udp套接字非常有用,但在事件处理方面它并没有给你带来任何好处。

旧答案

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


<强>问题:

  

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

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


<强>问题:

  

如何等待这两个事件?

答案:

你不能在同一个帖子中同时做两件事......说你有两个选择:

  1. 不断轮询以查看是否发生了任何一个事件(在同一个线程上)。
  2. 有两个阻塞的线程,直到发生所需的事件(通常当你从一个套接字中读取它时,如果没有数据则阻塞它)。
  3. 鉴于对您的问题的描述,您不清楚使用boost::condition_variable和/或boost::asio::io_service可以实现的目标。也许你应该给我们一个非常简单的代码示例,我们可以遵循。


    <强>问题:

      

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

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

答案 1 :(得分:0)

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