Sobes.tech
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.