La prego di dirmi se l'approccio che uso per gestire il caso d'uso non è valido e in caso affermativo, qual è il modo giusto per gestire:concorrenza :: cause compito destructor chiamano ad abortire in caso d'uso valida
task<int> do_work(int param)
{
// runs some work on a separate thread, returns task with result or throws exception on failure
}
void foo()
{
try
{
auto result_1 = do_work(10000);
auto result_2 = do_work(20000);
// do some extra work
process(result_1.get(), result_2.get());
}
catch (...)
{
// logs the failure details
}
}
Quindi il codice tenta di eseguire due processi in parallelo e quindi elaborare i risultati. Se uno dei lavori genera un'eccezione, chiama lo task::get
per rigenera l'eccezione. Il problema si verifica se entrambe le attività generano un'eccezione. In questo caso, la prima chiamata a task::get
causerà lo svolgimento dello stack, quindi verrà chiamato il distruttore del secondo task
e a sua volta farà ricominciare un'altra eccezione durante lo svolgimento dello stack che provoca la chiamata di "abort".
Questo approccio mi è sembrato del tutto valido finché non ho affrontato il problema.
Eventualmente correlato http://stackoverflow.com/questions/4766768/unhandled-forced-unwind-causes-abort?rq=1 – CoryKramer
Perché il (secondo) compito viene lanciato dal suo distruttore? – StackedCrooked
@StackedCrooked ... Questa è in realtà la domanda principale. O ho sbagliato o 'task' destructor rigenera davvero l'eccezione che è stata catturata nella funzione' do_work'. – topoden