Действительно, единственный способ устранить ошибку сегментации - это запустить Sensor::doWork
в совершенно отдельном процессе .
В UNIX это включает использование fork
(или некоторых других подобных средств), запуск Sensor::doWork
в дочернем процессе и затем каким-то образом возвращение результатов в родительский процесс.
Я предполагаю, что аналогичные средства доступны в Windows.
РЕДАКТИРОВАТЬ: Я думал, что я немного конкретизирую некоторые вещи, которые вы можете сделать.
Решение № 1: вы можете работать с процессами так же, как и с потоками. Например, вы можете создать пул процессов, который будет находиться в цикле
- Подождите, пока задача будет передана по каналу или очереди или подобному объекту
- Выполнить задание
- Возвращать результаты по каналу, очереди или подобному объекту
И поскольку вы выполняете задачи в других процессах, вы защищены от их сбоев. Основная трудность с этим решением - это общение между процессами; может быть, в этом поможет библиотека interprocess boost. В основном я делал подобные вещи в python, который имеет стандартный модуль multiprocessing
, который обрабатывает эти вещи для вас.
Решение № 2: Вы можете разделить ваше приложение на «безопасные» и «рискованные» части, которые работают в разных процессах. В «рискованной» части выполняются методы Sensor::doWork
и все остальное, что вы, возможно, захотите сделать в этом процессе, - но только та работа, которая допустима, если она самопроизвольно теряется в случае сбоя. «Безопасная» часть имеет дело с любой ценной информацией, которую вы не можете позволить себе потерять, и отслеживает «рискованную» часть, выполняя некоторые операции восстановления после сбоя ребенка. И, конечно, любую другую работу, которую вы решите выполнять в безопасной части.