Temos uma função para a qual um único thread chama (chamamos isso de thread principal). Dentro do corpo da função, geramos vários threads de trabalho para fazer um trabalho intensivo de CPU, esperamos que todos os threads terminem e, em seguida, retornamos o resultado no thread principal.
O resultado é que o chamador pode usar a função ingenuamente e, internamente, fará uso de vários núcleos.
Tudo bem até agora ..
O problema que temos é lidar com exceções. Não queremos exceções nos threads de trabalho para travar o aplicativo. Queremos que o chamador da função possa capturá-los no thread principal. Devemos capturar exceções nos threads de trabalho e propagá-los para o thread principal para que continuem sendo desenrolados a partir daí.
Como podemos fazer isso?
O melhor que posso pensar é:
- Capture toda uma variedade de exceções em nossos threads de trabalho (std :: exception e algumas das nossas próprias).
- Registre o tipo e a mensagem da exceção.
- Tenha uma instrução switch correspondente no thread principal que relança exceções de qualquer tipo que tenha sido registrado no thread de trabalho.
Isso tem a desvantagem óbvia de suportar apenas um conjunto limitado de tipos de exceção e precisaria de modificação sempre que novos tipos de exceção fossem adicionados.