C ++ 11 unir com segurança um thread sem usar um bloco try / catch
De acordo com a documentaçãoAqui eAqui, o método de junção de um encadeamento C ++ 11 lançará umstd::system_error
E sejoinable() == false
. Assim, a maneira natural de esperar por um encadeamento para concluir a execução é algo nos moldes de:
if (thread2.joinable()) thread2.join();
No entanto, isso tem a possibilidade de lançar um std :: system_error. Considere thread1 chama thread2.joinable (), retorna true, indicando que o thread2 ainda está em execução. Em seguida, o agendador pausa o thread1 e alterna os contextos para o thread 2. O thread 2 é concluído e, em seguida, o thread 1 é retomado. O segmento 1 chama thread2.join (), mas o thread2 já foi concluído e, como resultado, std :: system_error é lançado.
Uma solução possível é envolver a coisa toda em um bloco try:
try {
thread2.join();
catch (std::system_error &e) {}
Mas quando um std :: system_error legítimo é lançado, possivelmente para indicar que o encadeamentonão conseguiu participar, o programa continua, agindo como se tudo estivesse bem e dandy. Existe uma maneira correta de ingressar em um thread além de usar um bloco try / catch como este?