Nous avons une fonction dans laquelle un seul thread appelle (nous l'appelons le thread principal). Dans le corps de la fonction, nous générons plusieurs threads de travail pour effectuer un travail intensif en CPU, attendons que tous les threads se terminent, puis renvoyons le résultat sur le thread principal.
Le résultat est que l'appelant peut utiliser la fonction naïvement, et en interne, il utilisera plusieurs cœurs.
Tout va bien jusqu'à présent ..
Le problème que nous avons est celui des exceptions. Nous ne voulons pas que les exceptions sur les threads de travail bloquent l'application. Nous voulons que l'appelant de la fonction puisse les attraper sur le thread principal. Nous devons intercepter les exceptions sur les threads de travail et les propager vers le thread principal pour qu'elles continuent à se dérouler à partir de là.
Comment peut-on le faire?
Le mieux auquel je puisse penser est:
- Attrapez toute une variété d'exceptions sur nos threads de travail (std :: exception et quelques-unes de nos propres).
- Enregistrez le type et le message de l'exception.
- Avoir une instruction switch correspondante sur le thread principal qui relance les exceptions de tout type enregistré sur le thread de travail.
Cela présente l'inconvénient évident de ne prendre en charge qu'un ensemble limité de types d'exceptions et nécessiterait une modification chaque fois que de nouveaux types d'exceptions seraient ajoutés.