Junior — Middle
Da li ste se susretali sa problemima međusobnog blokiranja prilikom razvoja višestrukih sistema?
sobes.tech АИ
Одговор од АИ
Da, tokom razvoja višestrukih niti, suočio sam se sa problemom deadlock-a. To je situacija u kojoj dve ili više niti zauvek blokiraju jedna drugu, čekajući da oslobode resurse koje drže jedna drugu.
Da bih izbegao deadlock-ove, primenjujem sledeće prakse:
- Uvek uzimati više zaključavanja u istom redosledu.
- Minimizirati vreme zadržavanja zaključavanja.
- Koristiti timeout-ove prilikom pokušaja uzimanja zaključavanja.
- Koristiti primitives za sinhronizaciju višeg nivoa, poput kanala u Go.
Primer jednostavnog deadlock-a u Go:
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()
}
Ovde, f1 i f2 mogu da se blokiraju međusobno ako oba zauzmu prvi mutex i čekaju drugi. Da bih to izbegao, potrebno je koordinisati redosled uzimanja mutex-a.