PavelK
@PavelK

Поможет ли вынос работы с крэшащейся библиотекой в отдельный поток от крэша всего приложения?

Приветствую!
В общем, есть либа - она время от времени крэшится по её собственным мотивам, на разработчика повлиять невозможно.
Хочу попробовать вынести всю работу с ней в отдельный поток...
Так вот, как можно сделать, что бы крэшился лишь отдельный поток, не затрагивая приложение в целом? Кроссплатформенно...

P.S. Именно в другой поток, не процесс.. А то таких либ не одна и закалебусь под каждую ещё по проге писать.
  • Вопрос задан
  • 125 просмотров
Пригласить эксперта
Ответы на вопрос 3
@menkar3
Вкратце - скорее всего нет. Кроссплатформенно - еще более сомнительно.
Как именно крашится либа? Я так понял, это не вылетевшее C++ исключение, а что-то вроде коррапта памяти (хотя в самой либе может быть гадость вроде if(fail){exit(-1);}, с чем уже работать проблематично). В теории, можно для каждой платформы это обработать. Если сходу - как это можно реализовать для винды:
На самом деле выносим работу с либой в отдельный поток. Когда она сделает что-то плохое (к примеру, попытается читать освобожденную память) будет выброшено SEH исключение, для которого мы можем зарегистрировать обработчик (using a vectored exception handler в msdn). В хендлере можно было бы проверить, что исключение выброшено именно из треда этой либы и если это действительно так - просто грохнуть этот тред. Но даже если сработает это крайне плохой метод - либа захватывает какие-то ресурсы и нет никакой гарантии, что она корректно их освободит при падении треда (да и что приложение вообще останется в согласованном состоянии - кто знает, почему она падает - может, там вообще половина памяти перед этим мусором перезаписывается). Короче, решение с потоком - это потенциально нестабильная работа всего приложения.
Для изоляции памяти и использования ресурсов как раз и существуют процессы, как бы не хотелось от них уйти :)
Так что решение с отдельным процессом, который будет изолировать все болячки либы и не давать им распространиться на все приложение таки самое безопасное.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Можно форкать себя же с нужными параметрами и загружать только сам обработчик либы в фоне без всего остального и получать через pipe результат отработки либы.
Отвалится - не вопрос: снова форк.
(это первое, что пришло в голову)

Также, можно загрузчик вынести в отдельную динамическую либу, чтобы не тащить много в оперативу.

Там уже - по ситуации надо смареть...
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Тема выходит за границы чистого С++. Автор расскажи что у тебя Windows или Linux.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы