Junior — Middle
V-ați confruntat cu probleme de blocare mutuală în timpul dezvoltării sistemelor multi-thread?
sobes.tech AI
Răspuns de la AI
Da, în dezvoltarea sistemelor multi-thread am întâmpinat problema blocajului mutual (deadlock). Este o situație în care două sau mai multe fire de execuție se blochează reciproc, așteptând să elibereze resursele ocupate de celălalt.
Pentru a evita deadlock-urile, aplic următoarele practici:
- Întotdeauna să obțin mai multe blocări în aceeași ordine.
- Să minimizez timpul de menținere a blocărilor.
- Să folosesc timeout-uri la încercarea de a obține blocări.
- Să folosesc primitive de sincronizare de nivel superior, precum canalele în Go.
Exemplu de deadlock simplu în 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()
}
Aici, f1 și f2 se pot bloca reciproc dacă ambele obțin primul mutex și așteaptă al doilea. Pentru a evita acest lucru, trebuie să coordonez ordinea de obținere a mutexurilor.