如何确定 std::async 任务何时启动?

f1m*_*sch 1 c++ asynchronous

我正在阅读 cppreference async#Notes 正如其Notes所言,我不太明白它的含义。但作为结论,我知道std::async(std::launch::async, ...)并不总是立即启动一个以异步方式运行的新线程。

在 cppreference 的示例中f()g()似乎在同一个线程中运行并g()f()?是吗?

如果什么

void ff(){std::async(std::launch::async, []{ f(); });}
void gg(){std::async(std::launch::async, []{ g(); });}
int main(){
    ff();
    gg();
}
Run Code Online (Sandbox Code Playgroud)

g()不等待完成就开始吗f()

总而言之,如何理解async#Notes的内容?可以向我展示更多细节或示例吗?

for*_*818 5

作为参考,来自cppreference的完整注释(强调我的):

实现可以std::async通过在默认启动策略中启用附加(实现定义的)位来扩展第一次重载的行为。

实现定义的启动策略的示例是同步策略(在调用内立即执行std::async)和任务策略(与 类似std::async,但不会清除线程局部变量)

如果std::future获取的 fromstd::async未从引用移动或绑定到引用,则 the 的析构函数std::future将在完整表达式的末尾阻塞,直到异步操作完成,本质上使代码如以下同步:

std::async(std::launch::async, []{ f(); }); // temporary's dtor waits for f()
std::async(std::launch::async, []{ g(); }); // does not start until f() completes
Run Code Online (Sandbox Code Playgroud)

std::futures请注意,通过调用以外的方式获得的析构函数std::async永远不会阻塞。

注释主要指出std::future从调用返回的std::async块直到任务完成。关于求值顺序,上面的代码或多或少相当于

 f();
 g();
Run Code Online (Sandbox Code Playgroud)

是否在相同线程或不同线程上调用fg取决于实现。如果你想要真正的异步性,你必须保留返回的 future:

 auto f1 = std::async(std::launch::async, []{ f(); });
 auto f2 = std::async(std::launch::async, []{ g(); });
Run Code Online (Sandbox Code Playgroud)

只有这样,您才能获得异步调用,并且首先调用gor 。f是否在同一个线程上调用它们仍然取决于实现。

他们没有在任何地方这么说,f并且g必然在同一线程上调用,并且得出这样的结论是错误的。可以编写没有并发且没有异步调用的多线程代码。通常这不是您想要的,因此注释指出了返回的重要性std::future