Sobes.tech
Senior

Quelles primitives de synchronisation existent en Go ? En quoi RWMutex diffère-t-il d'un Mutex ordinaire ?

sobes.tech IA

Réponse de l'IA

En Go, les primitives de synchronisation du package sync sont utilisées, les principales sont :

  • Mutex — un mutex simple pour l’exclusion mutuelle, bloque l’accès à une ressource pour tous les autres goroutines jusqu’à ce qu’il soit déverrouillé.
  • RWMutex — un mutex avec séparation entre lecture et écriture. Permet à plusieurs goroutines de lire simultanément (RLock), mais l’écriture (Lock) est exclusive et bloque tout le monde.
  • WaitGroup — pour attendre la fin d’un groupe de goroutines.
  • Cond — une variable conditionnelle pour la signalisation entre goroutines.

Différence entre RWMutex et Mutex :

  • Mutex bloque complètement l’accès, ne permettant qu’à un seul propriétaire.
  • RWMutex permet à plusieurs lecteurs de maintenir le verrouillage simultanément s’il n’y a pas d’écrivains.
  • L’écriture avec RWMutex est exclusive et bloque tous les autres.

Exemple :

var mu sync.RWMutex
var data int

func readData() int {
    mu.RLock()         // verrouillage pour lecture
    defer mu.RUnlock()
    return data
}

func writeData(val int) {
    mu.Lock()          // verrouillage exclusif pour écriture
    defer mu.Unlock()
    data = val
}

L’utilisation de RWMutex améliore la performance dans les scénarios avec des lectures fréquentes et des écritures rares.