私の理解では、非同期操作で例外がスローされると、それはstd::future::get()
を呼び出すスレッドに伝播されます。しかし、そのようなスレッドがstd::future::wait()
を呼び出すと、例外は即座に伝播されません。それは、その後のstd::future::get()
の呼び出しでスローされます。例外の伝播とstd :: future
std::future::wait()
の呼び出しの後で、将来のオブジェクトが範囲外になる場合、そのようなシナリオでは、std::future::get()
の呼び出しの前に、そのような例外が発生するはずのことはありますか?
興味のある方は、ここに簡単な例があります。この場合、例外は黙ってスレッド/将来のパッケージによって処理されます:
#include "stdafx.h"
#include <thread>
#include <future>
#include <iostream>
int32_t DoWork(int32_t i)
{
std::cout << "i == " << i << std::endl;
throw std::runtime_error("DoWork test exception");
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
auto f = std::async(DoWork, 5);
try
{
//f.get(); // 1 - Exception does propagate.
f.wait(); // 2 - Exception does NOT propagate.
}
catch(std::exception& e)
{
std::cout << e.what() << std::endl;
return -1;
}
return 0;
}
私は例外に何も起こりません、それは単に無視されます。 (しかし私はこれで十分であるとは限りません) – Mat
例外は 'std :: exception_ptr'sによってスレッド間で伝播されることに注意することが重要です。したがって、システムには例外がキャッチされ、伝播メカニズムが再スローすることを決定するまで例外が処理されるように見えます。 –