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.