c++ - Boost异步主线程回调

标签 c++ multithreading asynchronous boost boost-thread

第一次在 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# 中的线程处理”(这是一个相当广泛的主题)中,主线程通常也会在处理线程的 message queue 时处理回调。 .

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

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

如果您恰好在使用 Qt,那么 this question 的答案向您展示了如何将 asio io_service 与您的消息循环相结合(我还没有尝试过)。

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

关于c++ - Boost异步主线程回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29672399/

相关文章:

c# - EF6 ToListAsync 不运行异步但阻塞线程

java - 异步编程和响应式(Reactive)编程

c++ - Xlib如何在不同的程序中使用XSaveContext/XFindContext

c++ - QT - 只用键填充 QMap,然后为每个键添加值

c++ - 生成随机位的最快方法

asynchronous - 无法看到在julia @spawn方法内发生的错误

c++ - 在静态控件上绘制图像

c - 将大量线程固定到单个 CPU 会导致所有内核的利用率激增

java - SWING 应用程序挂起,消耗大量 CPU

python - 在 Python 中与 os.system() 并行运行两个可执行文件?