c++ - 为什么 std::async 使用同一个线程运行函数
问题描述
我正在阅读一篇关于使用 c++ 进行并发编程的文章(链接)。在本文中,作者展示了 std::async 使用同一线程运行两个函数的代码。此外,当他将 std::future 与 std::async 一起使用时,它再次以不同的方式运行并使用独立线程运行所有函数。为什么 async 会表现得像这样并且它具有这种不受控制的方式?另外,我怎样才能用这个特性开发一个真正的并发程序?这有可能吗,还是我应该错过它?
解决方案
我建议还阅读参考资料,在“注释”部分中更好地解释发生了什么
如果从 std::async 获得的 std::future 未从引用移动或绑定到引用,则 std::future 的析构函数将在完整表达式的末尾阻塞,直到异步操作完成[...]
或者换句话说,std::async
返回 a std::future
。一旦返回的对象被销毁,它将等到它所代表的运行操作结束。因此,如果您丢弃返回值,例如
std::async(xyz);
返回值的析构函数在返回后立即被调用,因此等待xyz
.
如果您保留返回的值,例如
auto futureXyz = std::async(xyz);
它确实并行运行。那是因为返回的值被移动到变量futureXyz
中,所以局部变量“拥有”并行执行的函数。
我不会将其称为“不受控制的行为”,这只是您无法预料的事情,但它已明确定义。
推荐阅读
- android - 无法在两个列表视图或水平按钮列表之间画线
- ios - 我整天都在尝试计算用户字符并将它们打印到屏幕上
- merge - Mixpanel:合并重复的人员资料并合并事件
- c# - 格式为“dMMyyyy”的 ParseExact 无法识别日期
- azure - 对 Azure AKS 检查进行就绪探测的 Kubernetes pod 返回 404 http 状态
- javascript - 使用带有页眉和页脚的 Javascript(客户端)生成 PDF
- vue.js - 为什么当我在 Vue.js 中导入 lodash 时它不起作用
- javascript - JS 中的 Async/Await 混淆
- javascript - 如何使用 jquery/javascript 在 asp.net c# 中禁用单选按钮单击上的链接按钮
- servicenow - Servicenow UI 策略脚本以引用从引用字段中提取数据的字段