La mia comprensione è che quando un'operazione asincrona genera un'eccezione, verrà propagata a un thread che chiama std::future::get()
. Tuttavia, quando tale thread chiama std::future::wait()
, l'eccezione non viene immediatamente propagata, ma verrà lanciata in seguito a una chiamata a std::future::get()
.Propagazione di eccezioni e std :: future
Tuttavia, in uno scenario del genere, che cosa dovrebbe accadere a tale eccezione se l'oggetto futuro esce dall'ambito dopo una chiamata a std::future::wait()
, ma prima di una chiamata a std::future::get()
?
Per chi è interessato, ecco un semplice esempio. In questo caso, l'eccezione viene silenziosamente gestita dal pacchetto filo/futuro:
#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;
}
I _think_ non succede nulla all'eccezione, semplicemente viene ignorato. (Ma non sono abbastanza familiare con questo per essere sicuro.) – Mat
Immagino sia importante notare che le eccezioni sono propagate attraverso i thread di 'std :: exception_ptr's. Quindi al sistema l'eccezione sembra essere catturata e gestita fino a quando il meccanismo di propagazione non decide di ricominciare. –