Sobes.tech
Back to questions
Middle+
4

Что такое Deadlock? Как избежать взаимной блокировки?

Companies where asked
YadroYadro

Answer from AI

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 с таймаутом.