Boost异步主线程回调



第一次在C++中使用线程。我一直在考虑使用boost,这对我来说很困惑。基本上我想做的就是:

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

所以类似于C#中的线程处理。

似乎没有人支持2。将io_service与async函数一起使用,然后在io_seervice上使用run()似乎会阻塞主线程。所以不是很异步。

我已经尝试过使用boost::future,就像这里的例子一样:使用boost::future with"那么";连续

这里的"then"延续是在一个单独的线程中完成的,而不是在主线程中,所以不是我想要的。有什么办法改变这一点吗?使用boost::launch::deferred和wait()使调用同步,所以这也没有帮助。与仅在boost::future构造上使用get()相同。

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

无论主线程在做什么,都会抢占它来开始处理回调,这是不寻常的。即使在"C#中的线程处理"(这是一个相当宽泛的主题)中,主线程在处理线程的消息队列时通常也会处理回调。

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

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

如果您碰巧在使用Qt,那么这个问题的答案将向您展示如何将asio-io_service与消息循环相结合(我还没有尝试过)。

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

最新更新