何时需要使用std::async(std::launch::asyncfunc())而不是func(()

When should I need to use std::async(std::launch::async, func()) instead of func()?

本文关键字:std func asyncfunc launch async 何时需      更新时间:2023-10-16

我不明白使用带有std::lauch::async标志的std::async,而不是简单地调用传递给std::async的函数背后的原因。有什么特别保证吗?

根据文档,有一个重载,它只接受函数及其参数。您使用的重载接受更具体的策略

async(f, args...)等效于async(std::launch::async | std::launch::deferred, f, args...),其中两个标志的存在将取决于该函数是简单地从当前调用堆栈解耦(推迟到第一个非定时等待函数的执行;这被称为延迟求值),还是实际上是多线程的。

您正在使用的调用,通过只给std::launch::async,确保函数在自己的线程中明确执行,避免任何阻塞调用线程的工作。

当然,这两种变体仍然与直接调用f(args...)完全不同,后者保证了立即评估。

是的,调用线程不会阻塞,因为std::async会生成一个单独的线程来调用函数。这意味着,如果您单击GUI按钮开始处理一个复杂的任务,这将需要几分钟的时间,那么GUI会做出响应,尽管处理尚未完成。