Junior — Middle
Avez-vous déjà rencontré un blocage mutuel (Deadlock) lors de l'utilisation du multithreading?
sobes.tech IA
Réponse de l'IA
Oui, j'ai déjà rencontré des situations de blocage mutuel (deadlock) dans des programmes multithread. Un deadlock se produit lorsque deux ou plusieurs threads attendent indéfiniment la libération de ressources occupées par d'autres, ce qui entraîne un arrêt.
Par exemple, si le thread A a acquis la ressource 1 et attend la ressource 2, et le thread B a acquis la ressource 2 et attend la ressource 1, un deadlock se produit.
En Go, cela peut arriver lors de l'utilisation de mutex ou de canaux sans synchronisation correcte. Pour éviter les deadlocks, il est important de:
- Toujours acquérir les ressources dans le même ordre.
- Utiliser des timeouts ou des contextes avec annulation.
- Minimiser la durée de détention des verroux.
Exemple d'un deadlock potentiel avec des mutex:
var mu1, mu2 sync.Mutex
func f1() {
mu1.Lock()
defer mu1.Unlock()
time.Sleep(time.Second)
mu2.Lock()
defer mu2.Unlock()
// travail
}
func f2() {
mu2.Lock()
defer mu2.Unlock()
time.Sleep(time.Second)
mu1.Lock()
defer mu1.Unlock()
// travail
}
Ici, f1 et f2 peuvent se bloquer mutuellement si appelés simultanément.