CodeSOD: Запри их насмерть Заметка
The Daily WTF на русском

CodeSOD: Запри их насмерть

Предоставленный фрагмент кода на C++ демонстрирует обработчик исключений для исключения Deadlock. При перехвате этого исключения код пытается выполнить retry. Однако retry не является стандартным ключевым словом C++ и, скорее всего, является макросом. Автор предполагает, что этот макрос реализован с использованием оператора goto.Основная проблема заключается в предположении, что retry разрешит взаимоблокировку. Взаимоблокировка возникает, когда два или более потока бесконечно заблокированы, каждый из которых ожидает ресурс, удерживаемый другим. Чтобы retry был эффективным, он должен был бы освободить ресурс, удерживаемый в данный момент заблокированным потоком.По словам Кевина, автора кода, макрос retry не освобождает никаких ресурсов. Вместо этого он просто переходит обратно к началу блока catch. Это означает, что поток остается в состоянии взаимоблокировки.Кевин отмечает, что система уже страдала от многочисленных взаимоблокировок. Был нанят консультант для решения этих проблем путем изменения порядка доступа к ресурсам и выявления проблем, связанных с мьютексами. Реализация retry консультантом, по-видимому, непреднамеренно привела к большему количеству взаимоблокировок. Кевин в шутку предполагает, что консультант мог намереваться добавить свои собственные взаимоблокировки.