Junior — Middle
Avez-vous rencontré des problèmes de blocage mutuel lors du développement de systèmes multithread?
sobes.tech IA
Réponse de l'IA
Oui, lors du développement de systèmes multithread, j'ai rencontré le problème de blocage mutuel (deadlock). C'est une situation où deux ou plusieurs threads se bloquent mutuellement, en attendant de libérer des ressources occupées par l'autre.
Pour éviter les deadlocks, j'applique les pratiques suivantes :
- Toujours acquérir plusieurs verrouillages dans le même ordre.
- Minimiser la durée de détention des verrouillages.
- Utiliser des délais d'attente lors de la tentative d'acquisition de verrouillages.
- Utiliser des primitives de synchronisation de niveau supérieur, comme les canaux en Go.
Exemple d'un simple deadlock en Go :
var mu1, mu2 sync.Mutex
func f1() {
mu1.Lock()
defer mu1.Unlock()
time.Sleep(time.Second)
mu2.Lock()
defer mu2.Unlock()
}
func f2() {
mu2.Lock()
defer mu2.Unlock()
time.Sleep(time.Second)
mu1.Lock()
defer mu1.Unlock()
}
Ici, f1 et f2 peuvent se bloquer mutuellement si tous deux acquièrent le premier mutex et attendent le second. Pour éviter cela, il faut coordonner l'ordre d'acquisition des mutex.