std :: async是如何实现的?

时间:2014-09-04 19:21:21

标签: c++ multithreading c++11 asynchronous

我想知道在面向性能的代码中使用std::async是否合适。具体地

  1. 从工作线程到主线程捕获异常是否有任何惩罚?
  2. 如何将值从worker返回到main?
  3. ref传递的输入参数实际上是否永远不会被复制?
  4. 我打算将繁重的会话对象传递给线程或写std::async

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

    编辑:

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

1 个答案:

答案 0 :(得分:2)

我们无法确切地告诉“std :: async如何实现”,因为你并没有提到实际提供该实现的特定工具链。

  

1。从工作线程到主线程捕获异常是否有任何惩罚?


定义“Penalty”究竟是什么意思?除非您澄清您的疑虑/要求,否则无法回答 通常不应该有任何惩罚,只需在线程中捕获创建抛出异常的异常。这只是可以通过join()向创建线程提供异常,这会导致通过处理join()来保留该特定异常的一些成本。

  

2。如何将值从worker返回到main?


引用c++ standards definition关于这一点的说法:

  

30.6.8函数模板异步

     

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


  

3。由ref传递的输入参数实际上是不会被复制的       不?

这一点在此详细解答:Passing arguments to std::async by reference fails。如您所见,它们被复制的默认情况 根据{{​​3}}的评论,可以通过@Yakk传递这些参数,以避免对副本进行操作,但需要参考。


  

std::async如何实施

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