Junior — Middle
Hai avuto esperienza di deadlock durante il lavoro con il multithreading?
sobes.tech AI
Risposta dell'AI
Sì, ho avuto esperienza con il blocco reciproco (deadlock) in programmi multithread. Un deadlock si verifica quando due o più thread aspettano indefinitamente che le risorse vengano rilasciate, portando a un blocco.
Ad esempio, se il thread A ha acquisito la risorsa 1 e aspetta la risorsa 2, e il thread B ha acquisito la risorsa 2 e aspetta la risorsa 1, si verifica un deadlock.
In Go, ciò può accadere usando mutex o canali senza sincronizzazione corretta. Per evitare deadlock, è importante:
- Acquisire sempre le risorse nello stesso ordine.
- Usare timeout o contesti con cancellazione.
- Minimizzare il tempo di blocco.
Esempio di un potenziale deadlock con mutex:
var mu1, mu2 sync.Mutex
func f1() {
mu1.Lock()
defer mu1.Unlock()
time.Sleep(time.Second)
mu2.Lock()
defer mu2.Unlock()
// lavoro
}
func f2() {
mu2.Lock()
defer mu2.Unlock()
time.Sleep(time.Second)
mu1.Lock()
defer mu1.Unlock()
// lavoro
}
Qui, f1 e f2 possono bloccarsi a vicenda se chiamati contemporaneamente.