Может ли поток упасть без обрушения процесса?

Может ли возникнуть такая ситуация, что поток в процессе падает или зависает из-за ошибки (ошибка сегментации, деление на ноль, повреждение памяти, состояние гонки и пр.), но при этом процесс с таким потоком внутри продолжает работать?

Если да, то когда возможна такая ситуация?


Ответы (2 шт):

Автор решения: Aziz Umarov

Ситуация типичная в многопоточном приложении.

Каждый поток отдельный класс как и процесс. С чего должна рушиться программа если скажем поток передачи данных упал?

Браузер обновляет страницу ошибка передачи данных, деление на ноль, страница не загрузилась Браузер работает дальше.

Вы пытаетесь считать и обработать файл другим потоком, поток умер не справился. как это должно влиять?

→ Ссылка
Автор решения: MSDN.WhiteKnight

В С++, с точки зрения стандарта, нет понятия "падает или зависает" - перечисленные состояния приводят к неопределенному поведению. Например, для деления на ноль это описано в разделе 8.6 Multiplicative operators, пункт 4:

If the second operand of / or % is zero the behavior is undefined.

Неопределенное поведение означает, что стандарт не накладывает ограничений на поведение программы, и реализация не обязана его документировать. В случае целочисленного деления на ноль, однако, поведение в большинстве реализаций хорошо известно: вся программа аварийно завершается при попытке деления на ноль в любом потоке. Более того, в Windows известны также используемые при этом коды SEH-исключений, что позволяет отреагировать на эту ситуацию и продолжить выполнение программы, в том числе и в том же потоке. Как это сделать, описано здесь: Перехват исключения при делении на 0

То же самое применимо к большинству других ошибочных ситуаций, кроме состояния гонки, так как оно обычно приводит не к аварийному завершению, а просто к считыванию/записи плохих данных. То есть на "Может ли поток упасть без обрушения процесса?" ответ - "теоретически да, смотря что понимать под падением". Но на практике стоит рассчитывать на то, что такие ошибки приведут к аварийному завершению всего процесса.

→ Ссылка