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