Sobes.tech
Junior — Middle

Kas teil on olnud kokkupuude vastastikuse lukustamise probleemidega mitme niidiga süsteemide arendamisel?

sobes.tech AI

Vastus AI-lt

Jah, mitme niidiga süsteemide arendamisel olen kokku puutunud deadlock (surma lukustus) probleemiga. See on olukord, kus kaks või rohkem niiti lukustavad üksteist igaveseks, oodates ressursside vabastamist, mida teised hoiab.

Deadlockide vältimiseks rakendan järgmisi praktikaid:

  • Alati saada mitu lukku samas järjekorras.
  • Minimeerida lukustamise aega.
  • Kasutada ajapiiranguid, püüdes lukke saada.
  • Kasutada kõrgema taseme sünkroniseerimise primitiive, näiteks kanaleid Go keeles.

Näide lihtsast deadlockist Go keeles:

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()
}

Siin võivad f1 ja f2 üksteist lukustada, kui mõlemad saavad esimese lukku ja ootavad teist. Selle vältimiseks tuleb koordineerida mutexide saamise järjekorda.