Что такое дедлоки?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Дедлок — это ситуация, когда две или больше горутин/потоков навсегда ждут друг друга и выполнение останавливается. Обычно это происходит, когда ресурсы захватываются в разном порядке или есть циклическая зависимость между блокировками. В Go это может проявляться как зависание программы или panic с сообщением о deadlock, если все goroutine заблокированы.
Определение:
Дедлок — это взаимная блокировка, при которой ни одна из участвующих сторон не может продолжить работу, потому что каждая ожидает ресурс, удерживаемый другой стороной.
В многопоточном и конкурентном коде это чаще всего связано с mutex, каналами, транзакциями или другими синхронизационными примитивами.
Пример использования:
Типичный пример в Go — одна goroutine пытается отправить значение в небуферизованный канал, но получателя нет, а другая в это время ждёт отправку в обратную сторону или держит mutex, необходимый первой goroutine.
package main
func main() {
ch := make(chan int)
ch <- 1 // отправка блокируется, потому что никто не читает из канала
}
Пояснение кода:
Код выше создает небуферизованный канал. Отправка в такой канал блокируется до тех пор, пока кто-то не начнет читать из него.
Здесь чтения нет вообще, поэтому main зависает. В реальном приложении Go может завершить программу с ошибкой вида fatal error: all goroutines are asleep - deadlock!.
Ключевые моменты:
- Дедлок возникает, когда участники ждут друг друга и никто не может продолжить выполнение.
- Частая причина — разный порядок захвата ресурсов, например mutex'ов.
- В Go дедлоки часто связаны с каналами, блокировками и ожиданием завершения goroutine.
- Избежать дедлока помогает единый порядок захвата ресурсов, таймауты и аккуратная работа с каналами.
- Важно отличать дедлок от обычной долгой операции: при дедлоке прогресс невозможен вообще.