Tenemos una función a la que llama un solo hilo (lo llamamos hilo principal). Dentro del cuerpo de la función, generamos varios subprocesos de trabajo para realizar un trabajo intensivo de la CPU, esperar a que finalicen todos los subprocesos y luego devolver el resultado en el subproceso principal.
El resultado es que la persona que llama puede usar la función de manera ingenua e internamente hará uso de múltiples núcleos.
Todo bien hasta ahora ..
El problema que tenemos es lidiar con las excepciones. No queremos que las excepciones en los hilos de trabajo bloqueen la aplicación. Queremos que la persona que llama a la función pueda capturarlos en el hilo principal. Debemos detectar excepciones en los subprocesos de trabajo y propagarlas al subproceso principal para que continúen desenvolviéndose desde allí.
¿Cómo podemos hacer esto?
Lo mejor que se me ocurre es:
- Detecte una gran variedad de excepciones en nuestros hilos de trabajo (std :: exception y algunas de las nuestras).
- Registre el tipo y mensaje de la excepción.
- Tenga una declaración de cambio correspondiente en el hilo principal que vuelva a generar excepciones de cualquier tipo que se haya registrado en el hilo de trabajo.
Esto tiene la desventaja obvia de que solo admite un conjunto limitado de tipos de excepciones y necesitaría modificaciones cada vez que se agregan nuevos tipos de excepciones.