Sobes.tech
Junior — Middle

Czy miałeś doświadczenie z blokadą wzajemną (Deadlock) podczas pracy z wielowątkowością?

sobes.tech AI

Odpowiedź od AI

Tak, miałem doświadczenie z wzajemnym blokowaniem (deadlock) w programach wielowątkowych. Deadlock występuje, gdy dwa lub więcej wątków oczekuje na zwolnienie zasobów, które są zajęte przez innych, co prowadzi do zatrzymania.

Na przykład, jeśli wątek A przejął zasób 1 i czeka na zasób 2, a wątek B przejął zasób 2 i czeka na zasób 1, dochodzi do deadlocka.

W Go może się to zdarzyć przy użyciu mutexów lub kanałów bez odpowiedniej synchronizacji. Aby uniknąć deadlocków:

  • Zawsze przejmuj zasoby w tej samej kolejności.
  • Używaj timeoutów lub kontekstów z anulowaniem.
  • Minimalizuj czas trzymania blokad.

Przykład potencjalnego deadlocka z mutexami:

var mu1, mu2 sync.Mutex

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

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

Tutaj, f1 i f2 mogą się nawzajem blokować, jeśli są wywoływane jednocześnie.