【问题标题】:Boost async main thread callback提升异步主线程回调
【发布时间】:2026-02-10 03:40:01
【问题描述】:

第一次在 C++ 中使用线程。我一直在研究使用 boost,这对我来说非常令人困惑。基本上我想做的就是:

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

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

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

我已尝试按照此处的示例使用 boost::future:Using boost::future with "then" continuations

这里的“then”延续是在一个单独的线程中完成的,而不是主线程,所以不是我想要的。有没有办法改变这个?使用 boost::launch::deferred 和 wait() 使调用同步,所以这也无济于事。与在 boost::future 构造上使用 get() 相同。

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

【问题讨论】:

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


    【解决方案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 上的另一个回调实现。

    【讨论】: