Sobes.tech
Назад к вопросам
Junior — Middle
79

Можете объяснить, что означает ситуация взаимной блокировки потоков в системе и как она возникает?

Компании, где спрашивали
Twinby

Ответ от нейросети

sobes.tech AI

Взаимная блокировка (deadlock) — это ситуация в многопоточной системе, когда два или более потока навсегда блокируют друг друга, ожидая освобождения ресурсов, которые заняты друг другом.

Например, поток A захватил ресурс 1 и ждёт ресурс 2, а поток B захватил ресурс 2 и ждёт ресурс 1. Ни один из потоков не может продолжить работу, так как каждый ждёт освобождения ресурса, занятых другим.

В Go это может происходить при использовании мьютексов или каналов, если не продумать порядок захвата ресурсов. Чтобы избежать взаимных блокировок, нужно:

  • Избегать циклических зависимостей при захвате ресурсов.
  • Использовать таймауты или попытки захвата с проверкой.
  • Придерживаться единого порядка захвата мьютексов.

Пример на Go с мьютексами:

var mu1, mu2 sync.Mutex

func f1() {
    mu1.Lock()
    defer mu1.Unlock()
    time.Sleep(time.Millisecond * 100) // имитация работы
    mu2.Lock() // может привести к deadlock, если другой поток захватил mu2 и ждёт mu1
    defer mu2.Unlock()
}

func f2() {
    mu2.Lock()
    defer mu2.Unlock()
    time.Sleep(time.Millisecond * 100)
    mu1.Lock()
    defer mu1.Unlock()
}

Если f1 и f2 запустить одновременно, может возникнуть взаимная блокировка.