Junior — Middle
Ar susidūrėte su tarpusavio užrakinimo problemomis kuriant daugiagijų sistemas?
sobes.tech AI
Atsakymas iš AI
Taip, kuriant daugiagijinius sistemas, susidūriau su deadlock (mirties užrakinimo) problema. Tai yra situacija, kai du ar daugiau sriegių amžinai blokuoja vienas kitą, laukdami išlaisvinti išteklius, kuriuos užima kitas.
Norint išvengti deadlock'ų, taikau šias praktikas:
- Visada įgyti kelis užraktus toje pačioje tvarkoje.
- Sumažinti užraktų laikymo laiką.
- Naudoti laiko limitus bandant įgyti užraktus.
- Naudoti aukštesnio lygio sinchronizacijos primitivius, pvz., kanalus Go kalboje.
Pavyzdys paprasto deadlock'o Go kalboje:
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()
}
Čia, f1 ir f2 gali viena kitą užblokuoti, jei abu įgyja pirmąjį mutex ir laukia antrojo. Norint to išvengti, reikia koordinuoti mutex'ų įgyjimo tvarką.