Sobes.tech
Junior — Middle

Mal ste skúsenosti s vzájomným zablokovaním (Deadlock) pri práci s viacvláknovým programovaním?

sobes.tech AI

Odpoveď od AI

Áno, mám skúsenosti s vzájomným zámkom (deadlock) v multithreadových programoch. Deadlock nastáva, keď dva alebo viac vlákien nekonečne čakajú na uvoľnenie zdrojov, ktoré držia iné, čo spôsobí zastavenie.

Napríklad, ak vlákno A získalo zdroj 1 a čaká na zdroj 2, a vlákno B získalo zdroj 2 a čaká na zdroj 1, vznikne deadlock.

V Go sa to môže stať pri použití mutexov alebo kanálov bez správnej synchronizácie. Aby ste sa vyhli deadlockom:

  • Vždy získavajte zdroje v rovnakom poradí.
  • Používajte timeouty alebo kontexty s zrušením.
  • Minimalizujte dobu držania zámkov.

Príklad potenciálneho deadlocku s mutexmi:

var mu1, mu2 sync.Mutex

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

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

Tu, f1 a f2 sa môžu navzájom zablokovať, ak sú volané súčasne.