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.