我的理解是,当异步操作抛出异常时,它将传播回调用std::future::get()
的线程。但是,当这样的线程调用std::future::wait()
时,异常不会立即传播 - 它会在随后调用std::future::get()
时抛出。
但是,在这种情况下,如果未来的对象在调用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;
}
答案 0 :(得分:18)
它被忽略并被丢弃,就像你wait()
代价但从不get()
那样。
wait()
简单地说“阻止直到将来准备就绪”,准备好了值或异常。由调用者实际get()
值(或异常)决定。通常你只会使用等待的get()
。
答案 1 :(得分:-1)
vs2012 \ VC11 \ CRT \ future.cpp
出错
static const char *const _Future_messages[] =
{ // messages for future errors
"broken promise",
"future already retrieved",
"promise already satisfied",
"no state"
};
此代码生成了对“_Future_messages”的无效接受,因为 _Mycode.value()返回4.
const char *__CLR_OR_THIS_CALL what() const _THROW0()
{ // get message string
return (_Get_future_error_what(_Mycode.value()));
}
//代码示例
std::future<int> empty;
try {
int n = empty.get();
} catch (const std::future_error& e) {
const error_code eCode = e.code();
char *sValue = (char*)e.what();
std::cout << "Caught a future_error with code " << eCode.message()
<< " - what" << sValue << endl;
}