std::async是如何实现的

How is std::async implemented?

本文关键字:实现 何实现 async std      更新时间:2023-10-16

我想知道在面向性能的代码中使用std::async有多合适。特别是

  1. 从工作线程到主线程捕获异常会受到惩罚吗
  2. 值是如何从worker返回到main的
  3. ref传递的输入参数是否真的从未被复制

我计划将一个重会话对象传递给线程或编写std::async

bool fun(MySession& sessRef);
MySession sess;
auto r = std::async(&fun, sess);

编辑:

  • 我计划将它与GCC 4.9.1和VS2013一起使用,因为该应用程序与平台无关。然而,大多数部署都是基于*nix的,因此GCC至少应该具有性能

我们不能确切地告诉"std::async是如何实现的",因为您指的不是实际提供该实现的特定工具链。

1.从工作线程到主线程捕获异常是否会受到惩罚?


定义"惩罚"的确切含义是什么?除非你澄清你的顾虑/要求,否则这是无法回答的
通常不应该有任何惩罚,只需在创建抛出异常的线程中捕获异常。只是可以通过join()将异常提供给创建线程,这会导致通过处理join()来保持特定异常的一些成本。

2.值是如何从worker返回到main的?


引用c++标准定义对这一点的看法:

30.6.8功能模板async

4返回:一个类型为future<typename result_of<typename decay<F>::type(typename decay<Args>::type...)>::type>的对象,该对象引用此对async的调用所创建的共享状态。


3.ref传递的输入参数是否从未被复制或不

这里详细回答了这一点:通过引用向std::async传递参数失败。如您所见,在默认情况下,它们被复制
根据@Yakk的评论,可以通过std::ref传递这些参数,以避免对副本进行操作,但需要引用。


std::async是如何实现的

我只能告诉c++标准需求,它应该如何实现,除非你指的是一个特定的工具链,它试图提供std::async的正确实现。