Junior — Middle
Имали ли сте опит с взаимна блокировка (Deadlock) при работа с многопоточност?
sobes.tech AI
Отговор от AI
Да, имам опит с взаимно блокиране (deadlock) в многопоточни програми. Deadlock възниква, когато два или повече нишки безкрайно чакат освобождаването на ресурси, заети от други, което води до спиране.
Например, ако нишка A е взела ресурс 1 и чака ресурс 2, а нишка B е взела ресурс 2 и чака ресурс 1, възниква deadlock.
В Go това може да се случи при използване на мютекси или канали без правилна синхронизация. За да избегнете deadlock, е важно:
- Винаги да взимате ресурсите в същия ред.
- Да използвате таймаути или контексти с отменяне.
- Да минимизирате времето за задържане на блокировките.
Пример за потенциален deadlock с мютекси:
var mu1, mu2 sync.Mutex
func f1() {
mu1.Lock()
defer mu1.Unlock()
time.Sleep(time.Second)
mu2.Lock()
defer mu2.Unlock()
// работа
}
func f2() {
mu2.Lock()
defer mu2.Unlock()
time.Sleep(time.Second)
mu1.Lock()
defer mu1.Unlock()
// работа
}
Тук, f1 и f2 могат да блокират взаимно, ако се извикат едновременно.