Pracuję nad biblioteką, w której pracuję nad różnymi zadaniami dla bibliotek innych firm, które wykonują względnie szkicową lub niebezpieczną pracę związaną z platformą. (W szczególności, piszę parser funkcji matematycznych, który wywołuje kompilatory JIT, takie jak LLVM lub libjit, w celu zbudowania kodu maszynowego.) W praktyce te biblioteki stron trzecich mają tendencję do roztrzaskać się (część z nich to moja wina , oczywiście, ale nadal chcę trochę ubezpieczenia).Jak izolować zadanie/wątek przed awarią?
Chciałbym więc móc bardzo zgrabnie radzić sobie z pracą umierającą okropnie - SIGSEGV, SIGILL, itd. - bez niszczenia reszty mojego kodu (lub kodu użytkowników nazywających mnie funkcje biblioteczne). Żeby było jasne, nie obchodzi mnie, czy ta konkretna praca może być kontynuowana (nie będę próbowała naprawiać stanu awaryjnego), ani też nie dbam o stan obiektów po takiej awarii (odrzucę je natychmiast, gdy nastąpi awaria). Chcę tylko być w stanie wykryć awarię, zatrzymać awarię przed usunięciem całego procesu, przestać wywoływać awarie i wznowić wykonywanie.
(Dla nieco większego kontekstu, kod w tym momencie jest pętlą for, testowanie każdego z dostępnych kompilatorów JIT.Niektóre z tych kompilatorów może ulec awarii.Jeśli tak, chcę po prostu wykonać continue;
i dalej z testowaniem innego kompilatora.)
Obecnie mam implementację opartą na signal()
, która nie udaje się całkiem koszmarnie; Oczywiście, jest to niezdefiniowane zachowanie dla longjmp()
z obsługi sygnału, a obsługa sygnałów oczekuje się, że zakończy się na exit()
lub terminate()
. Rzucanie kodu w inny wątek nie pomaga samo w sobie, przynajmniej tak jak dotąd testowałem. Nie mogę również zhackować sposobu, aby to działało przy użyciu wyjątków C++.
Jaki jest najlepszy sposób izolowania określonego zestawu instrukcji/wątku/zadania przed awarią?
To jedyny sposób na zrobienie tego. Wątek może uszkodzić pamięć w dowolnym miejscu procesu, więc po SEGV nie można zagwarantować, że pamięć nie ulegnie zmianie. – KeithB
Dzięki za heads-up. Prawie na pewno właściwa odpowiedź tutaj. Mam zamiar poczytać na fork() i towarzystwie. –