Sobes.tech
Junior — Middle

Pouvez-vous expliquer ce que signifie une situation de blocage mutuel des threads dans un système et comment elle se produit?

sobes.tech IA

Réponse de l'IA

Le blocage mutuel (deadlock) est une situation dans un système multithread où deux ou plusieurs threads se bloquent mutuellement, en attendant de libérer des ressources occupées par l'autre.

Par exemple, le thread A a acquis la ressource 1 et attend la ressource 2, tandis que le thread B a acquis la ressource 2 et attend la ressource 1. Aucun des threads ne peut continuer à travailler, car chacun attend que l'autre libère une ressource.

En Go, cela peut se produire lors de l'utilisation de mutex ou de canaux si l'ordre d'acquisition des ressources n'est pas planifié. Pour éviter les blocages mutuels, il faut:

  • Éviter les dépendances cycliques lors de l'acquisition des ressources.
  • Utiliser des délais d'expiration ou des tentatives d'acquisition avec vérification.
  • Respecter un ordre unique d'acquisition des mutex.

Exemple en Go avec des mutex:

var mu1, mu2 sync.Mutex

func f1() {
    mu1.Lock()
    defer mu1.Unlock()
    time.Sleep(time.Millisecond * 100) // simulation de travail
    mu2.Lock() // peut entraîner un deadlock si un autre thread a acquis mu2 et attend mu1
    defer mu2.Unlock()
}

func f2() {
    mu2.Lock()
    defer mu2.Unlock()
    time.Sleep(time.Millisecond * 100)
    mu1.Lock()
    defer mu1.Unlock()
}

Si f1 et f2 sont lancés simultanément, un blocage mutuel peut survenir.