Распространение исключений и std :: future

Насколько я понимаю, когда асинхронная операция выдает исключение, она будет передана обратно в поток, который вызывает 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;
}

10

Решение

Это игнорируется и отбрасывается, как если бы вы wait() за ценность, но никогда get() Это.

wait() просто говорит: «блокируй, пока будущее не будет готово», будь то готово со значением или исключением. Это до вызывающего на самом деле get() значение (или исключение). Обычно вы просто используете get(), который все равно ждет.

15

Другие решения

vs2012 \ VC11 \ элт \ 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;
}
-1

По вопросам рекламы [email protected]