Назад к вопросам
Junior — Middle
78
Можете объяснить, что означает ситуация взаимной блокировки потоков в системе и как она возникает?
Компании, где спрашивали
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 запустить одновременно, может возникнуть взаимная блокировка.