Sobes.tech
Junior — Middle
117

В каких ситуациях может возникнуть взаимоблокировка потоков или процессов?

Сұралған компаниялар
Lamoda Tech
Twinby

AI-дан жауап

sobes.tech AI

Взаимоблокировка (deadlock) возникает, когда два или более потоков или процессов одновременно ждут освобождения ресурсов, занятых друг другом, и ни один из них не может продолжить работу. Основные ситуации, приводящие к взаимоблокировке:

  • Потоки захватывают несколько ресурсов в разном порядке. Например, поток A захватил ресурс 1 и ждёт ресурс 2, а поток B захватил ресурс 2 и ждёт ресурс 1.
  • Использование блокировок (mutex) без строгого порядка захвата.
  • Циклическое ожидание ресурсов.

В Go это может произойти при неправильном использовании мьютексов, каналов или других синхронизирующих примитивов. Например, если два горутины ждут друг друга через каналы без таймаутов или буферов.

Чтобы избежать взаимоблокировок, нужно:

  • Захватывать ресурсы в одном и том же порядке.
  • Использовать таймауты или попытки захвата с возвратом ошибки.
  • Минимизировать время удержания блокировок.

Пример простой взаимоблокировки с мьютексами в Go:

var mu1, mu2 sync.Mutex

func goroutine1() {
    mu1.Lock()
    defer mu1.Unlock()
    time.Sleep(time.Millisecond * 100)
    mu2.Lock()
    defer mu2.Unlock()
    // работа
}

func goroutine2() {
    mu2.Lock()
    defer mu2.Unlock()
    time.Sleep(time.Millisecond * 100)
    mu1.Lock()
    defer mu1.Unlock()
    // работа
}

Здесь goroutine1 и goroutine2 могут взаимно блокироваться, если первая захватила mu1, а вторая — mu2, и обе ждут освобождения другого мьютекса.