The default std::terminate_handler прерывает текущий поток, а не весь процесс

Виктор Губин
Виктор Губин

Пердолжение очень простое.

std::terminate_handler по умолчанию должен прерывать только текущий поток (SIGSTOP), а не вызывать std::abort (SIGABRT).

Таким образом, для одно-поточной логики поведение прораммы не изменится, аварийная остановка единственного потока ведет к аварийной остановке всего процесса.

Однако в случае много-поточного приложения, например web сервера, обращение к std::terminate например: по выбросу исключения std::bad_alloc при нехватке памяти, или std::ios_base::failure при отказе HD диска, не приведет к краху всех потоков процесса, в том числе и тех которые могут завершится нормально. 

Подобная модель используется в Java.

-1
рейтинг
2 комментария
Antervis

некоторые приложения могут использовать нынешнее поведение в отладочных целях. Например, использующие google breakpad.

Antervis
Олег Ляттэ

Вы уверены, что просто грохнуть один поток в многопоточном приложении - безопасно? Это UB всего приложения в целом.

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

Нельзя так делать.

Олег Ляттэ
Обновлено 
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения