首页 > 解决方案 > 为什么 std::async 使用同一个线程运行函数

问题描述

我正在阅读一篇关于使用 c++ 进行并发编程的文章(链接)。在本文中,作者展示了 std::async 使用同一线程运行两个函数的代码。此外,当他将 std::future 与 std::async 一起使用时,它再次以不同的方式运行并使用独立线程运行所有函数。为什么 async 会表现得像这样并且它具有这种不受控制的方式?另外,我怎样才能用这个特性开发一个真正的并发程序?这有可能吗,还是我应该错过它?

标签: c++multithreadingconcurrency

解决方案


我建议还阅读参考资料,在“注释”部分中更好地解释发生了什么

如果从 std::async 获得的 std::future 未从引用移动或绑定到引用,则 std::future 的析构函数将在完整表达式的末尾阻塞,直到异步操作完成[...]

或者换句话说,std::async返回 a std::future。一旦返回的对象被销毁,它将等到它所代表的运行操作结束。因此,如果您丢弃返回值,例如

std::async(xyz);

返回值的析构函数在返回后立即被调用,因此等待xyz.

如果您保留返回的值,例如

auto futureXyz = std::async(xyz);

它确实并行运行。那是因为返回的值被移动到变量futureXyz中,所以局部变量“拥有”并行执行的函数。

我不会将其称为“不受控制的行为”,这只是您无法预料的事情,但它已明确定义。


推荐阅读