私の理解では、非同期操作が例外をスローすると、それは を呼び出すスレッドに伝播されますstd::future::get()
。ただし、そのようなスレッドが を呼び出したstd::future::wait()
場合、例外はすぐには伝播されず、後続の への呼び出しでスローされますstd::future::get()
。
std::future::wait()
ただし、このようなシナリオでは、呼び出しの後、呼び出しの前に将来のオブジェクトがスコープ外になった場合、そのような例外に何が起こるはずstd::future::get()
ですか?
興味のある方のために、ここに簡単な例を示します。この場合、例外は thread/future パッケージによって静かに処理されます。
#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;
}