Sobes.tech
Junior — Middle

Měl jste zkušenost s vzájemným zablokováním (Deadlock) při práci s vícenásobným vláknem?

sobes.tech AI

Odpověď od AI

Ano, mám zkušenosti s vzájemným zámkem (deadlock) v vícevláknových programech. Deadlock nastává, když dva nebo více vláken nekonečně čekají na uvolnění zdrojů, které drží jiná vlákna, což vede k zastavení.

Například, pokud vlákno A získalo zdroj 1 a čeká na zdroj 2, a vlákno B získalo zdroj 2 a čeká na zdroj 1, vznikne deadlock.

V Go se to může stát při použití mutexů nebo kanálů bez správné synchronizace. Abychom se vyhnuli deadlockům:

  • Vždy získávejte zdroje ve stejném pořadí.
  • Používejte časové limity nebo kontexty s zrušením.
  • Minimalizujte dobu držení zámků.

Příklad potenciálního deadlocku s mutexy:

var mu1, mu2 sync.Mutex

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

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

Zde mohou f1 a f2 vzájemně blokovat, pokud jsou volány současně.