Sobes.tech
Junior — Middle

Ar turėjote patirties su tarpusavio užblokavimu (Deadlock) dirbant su daugiagijais?

sobes.tech AI

Atsakymas iš AI

Taip, turiu patirties su tarpusavio užrakinimu (deadlock) daugiagijiniuose programuose. Deadlock įvyksta, kai du ar daugiau gijų amžinai laukia išlaisvinimo išteklių, kuriuos užima kitos, ir tai sukelia vykdymo sustojimą.

Pavyzdžiui, jei gija A įgijo išteklių 1 ir laukia išteklių 2, o gija B įgijo išteklių 2 ir laukia išteklių 1, susidaro deadlock.

Go kalboje tai gali įvykti naudojant mutexus arba kanalus be tinkamos sinchronizacijos. Norint išvengti deadlock, svarbu:

  • Visada įgyti išteklius tame pačiame tvarkoje.
  • Naudoti timeout'us arba kontekstus su atšaukimu.
  • Minimalizuoti užrakinimo laiką.

Potencialus deadlock pavyzdys su mutexais:

var mu1, mu2 sync.Mutex

func f1() {
    mu1.Lock()
    defer mu1.Unlock()
    time.Sleep(time.Second)
    mu2.Lock()
    defer mu2.Unlock()
    // darbas
}

func f2() {
    mu2.Lock()
    defer mu2.Unlock()
    time.Sleep(time.Second)
    mu1.Lock()
    defer mu1.Unlock()
    // darbas
}

Čia, f1 ir f2 gali viena kitą užrakinti, jei jie iškviečiami vienu metu.