Я работаю над библиотекой, в которой я выполняю различные задачи для некоторых сторонних библиотек, которые выполняют относительно скудную или опасную работу для конкретной платформы. (В частности, я пишу синтаксический анализатор математических функций, который вызывает JIT-компиляторы, такие как LLVM или libjit, для создания машинного кода.) На практике эти сторонние библиотеки имеют тенденцию быть сбойным (отчасти это моя ошибка конечно, но мне все еще нужна страховка).
Мне бы хотелось иметь возможность очень изящно справляться с ужасно умирающей работой - SIGSEGV, SIGILL и т. Д. - без сброса остальной части моего кода (или кода пользователей, вызывающих мою библиотеку). функции). Чтобы быть ясным, мне все равно, может ли эта конкретная работа продолжаться (я не собираюсь пытаться исправить состояние сбоя), и при этом я не забочусь о состоянии объектов после такого сбоя (я откажусь их немедленно, если есть крушение). Я просто хочу быть в состоянии обнаружить, что произошел сбой, не дать завершить процесс уничтожения всего процесса, прекратить вызывать любой сбой и возобновить выполнение.
(Для немного большего контекста, код на данный момент представляет собой цикл for, тестирующий каждый из доступных JIT-компиляторов. Некоторые из этих компиляторов могут аварийно завершиться. Если это произойдет, я просто хочу выполнить continue;
и получить с тестированием другого компилятора.)
В настоящее время у меня есть реализация на signal()
, которая довольно ужасно терпит неудачу; конечно, это неопределенное поведение для longjmp()
из обработчика сигнала, и обработчики сигнала, как ожидается, будут заканчиваться exit()
или terminate()
. Простое добавление кода в другой поток само по себе не помогает, по крайней мере, так, как я его тестировал до сих пор. Я также не могу найти способ заставить эту работу использовать исключения C ++.
Итак, каков наилучший способ изолировать определенный набор инструкций / потока / задания от сбоев?