Rozumiem, że gdy operacja asynchroniczna zgłasza wyjątek, zostanie ona propagowana z powrotem do wątku, który wywołuje std::future::get()
. Jednakże, gdy taki wątek wywołuje std::future::wait()
, wyjątek nie jest natychmiast propagowany - zostanie zgłoszony podczas kolejnego wywołania std::future::get()
.Rozsyłanie wyjątków i std :: future
Jednak w takim scenariuszu, co ma stać się z takim wyjątkiem, jeśli przyszły obiekt wykracza poza zakres po wywołaniu std::future::wait()
, ale przed wywołaniem do std::future::get()
?
Dla zainteresowanych, oto prosty przykład. W tym przypadku wyjątek jest cicho obsługiwane przez gwintu/pakiet przyszłości:
#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;
}
Ithink_ nic nie dzieje się z wyjątkiem, po prostu zostaje zignorowany. (Ale nie jestem dostatecznie zaznajomiony z tym, aby być pewnym.) – Mat
Sądzę, że ważne jest, aby zauważyć, że wyjątki są propagowane w wątkach przez 'std :: exception_ptr's. Tak więc do systemu wyjątek wygląda na zaczepiony i obsługiwany, dopóki mechanizm propagacji nie zdecyduje się go ponownie rzucić. –