gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:44 24 4
gpt4 key购买 nike

第一次在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com