У нас есть функция, к которой обращается один поток (мы называем это основным потоком). Внутри функции мы создаем несколько рабочих потоков для интенсивной работы с ЦП, дождитесь завершения всех потоков, а затем вернем результат в основной поток.
В результате вызывающая сторона может наивно использовать функцию, и внутренне она будет использовать несколько ядер.
Все хорошо до сих пор..
Проблема, которую мы имеем, имеет дело с исключениями. Мы не хотим, чтобы исключения из рабочих потоков приводили к сбою приложения. Мы хотим, чтобы вызывающая функция могла уловить их в основном потоке. Мы должны перехватывать исключения в рабочих потоках и распространять их в основной поток, чтобы они продолжали отматываться оттуда.
Как мы можем это сделать?
Лучшее, о чем я могу думать:
- Захватите множество исключений из наших рабочих потоков (std:: exception и несколько наших собственных).
- Запишите тип и сообщение об исключении.
- Имейте соответствующий оператор switch в основном потоке, который вызывает исключения любого типа, записанного в рабочем потоке.
Это имеет очевидный недостаток только в поддержке ограниченного набора типов исключений и будет нуждаться в модификации всякий раз, когда будут добавлены новые типы исключений.