Sobes.tech
Junior — Middle

Setkali jste s problémy vzájemného blokování při vývoji vícevláknových systémů?

sobes.tech AI

Odpověď od AI

Ano, při vývoji vícevláknových systémů jsem se setkal s problémem zablokování (deadlock). Jedná se o situaci, kdy dva nebo více vláken navždy zablokují navzájem, čekajíce na uvolnění zdrojů, které jsou obsazeny jiným.

Abych předešel deadlockům, aplikuji následující praktiky:

  • Vždy získávat více zámků ve stejném pořadí.
  • Minimalizovat dobu držení zámků.
  • Používat časové limity při pokusu o získání zámků.
  • Používat primitives synchronizace vyšší úrovně, například kanály v Go.

Příklad jednoduchého deadlocku v 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()
}

Zde se f1 a f2 mohou navzájem zablokovat, pokud oba získají první mutex a čekají na druhý. Abych tomu předešel, je nutné koordinovat pořadí získávání mutexů.