我的理解是,当异步操作抛出异常时,它会被传播回调用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;
}