Abbiamo una funzione che viene chiamata da un singolo thread (lo chiamiamo thread principale). All'interno del corpo della funzione generiamo più thread di lavoro per svolgere un lavoro intensivo della CPU, attendere il completamento di tutti i thread, quindi restituire il risultato sul thread principale.
Il risultato è che il chiamante può utilizzare la funzione in modo ingenuo e internamente farà uso di più core.
Tutto bene finora ..
Il problema che abbiamo è trattare le eccezioni. Non vogliamo che le eccezioni sui thread di lavoro blocchino l'applicazione. Vogliamo che il chiamante della funzione sia in grado di intercettarli nel thread principale. Dobbiamo intercettare le eccezioni sui thread di lavoro e propagarle al thread principale per farle continuare a svincolarsi da lì.
Come possiamo farlo?
Il meglio che riesco a pensare è:
- Cattura un'intera varietà di eccezioni sui nostri thread di lavoro (std :: exception e alcuni dei nostri).
- Registra il tipo e il messaggio dell'eccezione.
- Avere un'istruzione switch corrispondente sul thread principale che rigenera le eccezioni di qualsiasi tipo sia stato registrato sul thread di lavoro.
Ciò ha l'ovvio svantaggio di supportare solo un insieme limitato di tipi di eccezione e richiederebbe modifiche ogni volta che venivano aggiunti nuovi tipi di eccezione.