2015-04-16 57 views
2

第一次在C++中使用线程。我一直在寻找使用boost,这对我来说非常困惑。基本上所有我想要做的是:增强异步主线程回调

  1. 创建一个工作线程异步做一些工作。在工作完成时继续主线程。
  2. 工作线程完成后,用一些在主线程上下文中执行的结果触发一个回调函数。

因此,类似于C#中的线程处理。

似乎没有任何支持2.使用io_service和异步函数,然后使用io_service上的run()似乎阻止主线程。所以不是非常异步。

我使用boost ::未来按照这里的例子尝试:Using boost::future with "then" continuations

这里的“然后”的延续是在一个单独的线程中完成的,而不是主线程,所以不是我后。有什么办法可以改变它吗?使用boost :: launch :: deferred和wait()使得调用同步,所以这也没有帮助。与在boost :: future构造中使用get()一样。

似乎唯一的选择是创建一个互斥锁共享事件队列,并且只是在主线程中持续轮询它以获取新数据?

回答

1

为了开始处理回调,抢占主线程是非常不寻常的。即使在“C#中的线程处理”(这是一个相当广泛的主题)中,主线程通常会在处理线程的message queue时处理回调。

因此,通常情况下,主线程只在准备好时执行回调。一种实现方法是通过在io_service上调用run()。

您的主线程一次只能处理一个消息队列。如果您的应用程序恰好是Windows GUI应用程序,那么您的主线程已经在处理消息队列(Windows消息队列),并且不应该对IO服务(正在处理另一个消息队列)执行像run() )。在这种情况下,您可以决定编写将回调封装在Windows事件消息中并处理该消息的代码。

如果您碰巧在使用Qt,那么this question的答案将告诉您如何将一个asio io_service与您的消息循环(我没有试过那个)结合起来。

如果你的过程不是一个GUI应用程序,那么,因为你已经对asio有点熟悉了,所以你仍然可以使用io_service。然而,在这种情况下,主线程执行的函数(在初始化之后)应该作为该消息队列上的事件运行。例如:在你的问题中的“继续主线程”可以作为io_service上的另一个回调来实现。