提升异步主线程回调

时间:2015-04-16 10:46:51

标签: c++ multithreading asynchronous boost boost-thread

首次在C ++中使用线程。我一直在寻找使用对我来说非常困惑的提升。基本上我所要做的就是:

  1. 创建一个可以异步工作的工作线程。在工作完成时继续主线程。
  2. 当工作线程完成时,触发一个回调函数,其中包含在主线程上下文中执行的一些结果。
  3. 类似于C#中的线程处理。

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

    我已尝试使用boost :: future,例如:Using boost::future with "then" continuations

    这里"然后"延续是在一个单独的线程中完成的,而不是主线程,所以不是我所追求的。有没有办法改变这个?使用boost :: launch :: deferred和wait()会使调用同步,因此也无法提供帮助。与在boost :: future构造中使用get()相同。

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

1 个答案:

答案 0 :(得分:1)

在开始处理回调的过程中抢占主线程是不寻常的。即使在C#中的#34;线程处理" (这是一个相当广泛的主题)主线程通常在处理线程message queue时处理回调。

通常,主线程只在准备好时才执行回调。实现这种方法的一种方法是在io_service上调用run()。

您的主线程一次只能处理一个消息队列。如果您的应用程序碰巧是Windows GUI应用程序,那么您的主线程已经在处理消息队列(Windows消息队列),并且不应该在IO服务(处理另一个消息队列)上执行阻塞函数调用,如run() )。在这种情况下,您可以决定在Windows事件消息中编写包含回调的代码并进行处理。

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

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