从通过std :: async

时间:2017-01-25 15:28:52

标签: c++ multithreading c++11

通过std::async启动的功能抛出的异常会怎样?

#include <future>
#include <iostream>
#include <stdexcept>

void foo()
{
  std::cout << "foo()" << std::endl;
  throw std::runtime_error("Error");
}

int main()
{
  try
  {
    std::cout << "1" << std::endl;
    auto f = std::async(std::launch::async, foo);
    f.get();
    std::cout << "2" << std::endl;
  }
  catch (const std::exception& ex)
  {
    std::cerr << ex.what() << std::endl;
  }
}

MSVC给出了以下输出:

1
foo()
Error

通过调用get函数吗?

是否会在函数外部捕获此类异常

1 个答案:

答案 0 :(得分:8)

来自cppreference

  

[...]如果函数f返回值或抛出异常,则它存储在可通过std::future async访问的共享状态中返回调用者。

关于std::future::get()的参考文献:

  

如果异常存储在未来引用的共享状态中(例如通过调用std::promise::set_exception()),那么将抛出该异常。

所以是的,如果您的函数抛出异常,该异常基本上会延迟到将来并在get()上重新抛出。