Junior — Middle
Da li ste imali iskustva sa međusobnim blokiranjem (Deadlock) tokom rada sa višestrukim nitima?
sobes.tech АИ
Одговор од АИ
Да, имао сам искуства са међусобним блокирањем (deadlock) у мултитхред програмима. Deadlock се јавља када два или више тхреадова бесконачно чекају да се ресурси ослободе, што доводи до заустављања.
На пример, ако је тхреад А освојио ресурс 1 и чека ресурс 2, а тхреад Б освојио ресурс 2 и чека ресурс 1, јавља се deadlock.
У Go-у, ово може да се деси при коришћењу мјутекса или канала без правилне синхронизације. Да бисте избегли deadlock, важно је:
- Увек узимати ресурсе у истом редоследу.
- Користити timeout-ове или контексте са отказивањем.
- Минимизирати време задржавања блокирања.
Пример потенцијалног 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 могу да се блокирају међусобно ако се позову истовремено.