Sobes.tech
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 могу да се блокирају међусобно ако се позову истовремено.