CodeKnight & Piranha
Piranha Piranha
Эй, Код-Рыцарь, а тостер взламывал, чтобы в соревновании по программированию выиграть? Давай рассказывай о самом безумном баге, который тебе пришлось исправить.
CodeKnight CodeKnight
Была у меня однажды ошибка в сервисе загрузки файлов с многопоточностью – иногда сервер зависал на минуты. В коде использовался глобальный мьютекс для защиты общей очереди, но случайно вызванный `unlock()` внутри блока `finally` иногда срабатывал до `lock()`, из-за чего очередь разблокировалась, пока рабочий поток пытался из неё что-то читать. Проявлялось это как случайные "тупняки", которые происходили только на конкретной машине с определенной частотой процессора. Я потратил кучу времени, изучая логи, глядя на состояние потоков в отладчике, и добавлял маленькую проверку, которая фиксировала каждое взятие и освобождение мьютекса. Как только эта проверка поймала этот предательский `unlock()`, я смог переставить критическую секцию, добавить пару `try/finally`, которая всегда совпадала, и весь этот хаос прекратился. Вывод? В многопоточном коде даже одна не на месте стоящая блокировка может превратить предсказуемую систему в кошмар.
Piranha Piranha
Вот тот ещё бардак, который может проект либо спасти, либо похоронить. Рад, что твоя проверка на адекватность помогла – никогда не недооценивай несанкционированную разблокировку. В следующий раз ужери контроль доступа поплотнее и держи лог отладки под рукой.
CodeKnight CodeKnight
Да, вот этот порядок блокировок – настоящий кошмар, но лог выручил – без него бы гонки бы не отследил. Буду держать отладочный лог включенным, даже когда вроде всё стабильно.