Sobes.tech
Junior — Middle

Ai avut experiență cu blocajele mutuale (Deadlock) în timpul lucrului cu multithreading?

sobes.tech AI

Răspuns de la AI

Da, am avut experiență cu blocarea mutuală (deadlock) în programe multithread. Un deadlock apare atunci când două sau mai multe fire de execuție așteaptă indefinit eliberarea resurselor ocupate de altele, ceea ce duce la oprire.

De exemplu, dacă firul A a obținut resursa 1 și așteaptă resursa 2, iar firul B a obținut resursa 2 și așteaptă resursa 1, apare un deadlock.

În Go, acest lucru se poate întâmpla atunci când se folosesc mutex-uri sau canale fără sincronizare corectă. Pentru a evita deadlock-urile, este important:

  • Să se obțină resursele întotdeauna în aceeași ordine.
  • Să se folosească timeout-uri sau contexte cu anulare.
  • Să se minimizeze timpul deținere a blocărilor.

Exemplu de deadlock potențial cu mutex-uri:

var mu1, mu2 sync.Mutex

func f1() {
    mu1.Lock()
    defer mu1.Unlock()
    time.Sleep(time.Second)
    mu2.Lock()
    defer mu2.Unlock()
    // lucru
}

func f2() {
    mu2.Lock()
    defer mu2.Unlock()
    time.Sleep(time.Second)
    mu1.Lock()
    defer mu1.Unlock()
    // lucru
}

Aici, f1 și f2 pot bloca reciproc dacă sunt apelate simultan.