Назад к вопросам
Yadro
Middle+
3
Что такое Deadlock? Как избежать взаимной блокировки?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Deadlock (взаимная блокировка) — ситуация в многопоточных или конкурентных системах, когда два или более процесса (или горутины в Go) навсегда блокируют друг друга, ожидая освобождения ресурсов, которые заняты друг другом. В результате ни один из процессов не может продолжить работу.
Чтобы избежать deadlock, можно использовать следующие подходы:
- Избегать циклических зависимостей: всегда захватывать ресурсы в одном и том же порядке.
- Использовать таймауты при захвате блокировок: если ресурс не доступен, освобождать уже захваченные и повторять попытку.
- Минимизировать время удержания блокировок: держать блокировки только на критически важный участок кода.
- Использовать каналы и другие высокоуровневые примитивы Go, которые помогают избежать явных блокировок.
Пример потенциального deadlock в Go:
g1 := make(chan struct{})
g2 := make(chan struct{})
// Горутинa 1
go func() {
<-g1
g2 <- struct{}{}
}()
// Горутинa 2
go func() {
<-g2
g1 <- struct{}{}
}()
// Ни одна из горутин не сможет продолжить, так как обе ждут друг друга
Чтобы избежать, нужно продумать логику или использовать select с таймаутом.