Как сделать так, чтобы сбой потока не приводил к сбою процесса?

#c #multithreading #process

#c #многопоточность #процесс

Вопрос:

Мой язык проекта — C, и он будет запускать только один процесс и несколько потоков.

Один из потоков всегда сбой, это приведет к сбою процесса.

Стабильность процесса очень и очень важна. Итак, я хочу знать, возможно ли «изолировать» этот поток. Например, если мы можем перехватить сигнал SIGSEGV, мы можем просто перезапустить этот поток.

Ответ №1:

Если один поток делает что-то, что может вызвать сбой, это может повлиять на другой поток, поскольку они используют одно и то же пространство памяти, поэтому их невозможно изолировать.

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

Ответ №2:

Стабильность процесса очень и очень важна.

Тогда очень, очень важно, чтобы вы нашли и устранили причину SIGSEGV, а не «заделывали трещины», пытаясь восстановить поврежденные потоки.

Почему?

  • Потому что основной причиной SIGSEGV может быть ошибка, которая будет повторно запущена в перезапущенном потоке, что приведет к бесконечному сбою / перезапуску потоков.
  • Потому что основной причиной SIGSEGV может быть проблема в другом потоке… что может продолжать вызывать проблему.
  • Потому что на этапах выполнения, ведущих к SIGSEGV, поток мог повредить общие структуры данных или сделать другие вещи, которые могут привести к сбою, зависанию или неправильному поведению других потоков другими способами.

Ответ №3:

Зависит от причины сбоя. Это может быть связано с памятью, что приводит к повреждению данных, что приводит к сбою процесса. Если программа действительно аварийно завершает работу, и это критично, используйте Monit для ее перезапуска.