Senior
Quelles primitives de synchronisation connaissez-vous?
sobes.tech IA
Réponse de l'IA
En Go, il existe plusieurs primitives principales de synchronisation pour gérer l'accès concurrent aux ressources :
- Mutex (sync.Mutex) — assure une exclusion mutuelle, bloquant l'accès à la section critique.
- RWMutex (sync.RWMutex) — mutex étendu permettant à plusieurs lecteurs de lire simultanément, mais bloquant l'écriture.
- WaitGroup (sync.WaitGroup) — permet d'attendre la fin d'un groupe de goroutines.
- Cond (sync.Cond) — variable conditionnelle pour notifier les goroutines de la survenue d'un événement.
- Opérations atomiques (sync/atomic) — opérations de bas niveau pour la lecture et l'écriture atomiques de variables.
De plus, en Go, on utilise largement les canaux (channels), qui permettent de synchroniser les goroutines et de transmettre des données entre elles sans utiliser explicitement de mutex.
Exemple d'utilisation de Mutex :
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
defer mu.Unlock()
counter++
}
Exemple d'utilisation de WaitGroup :
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
// travail
}()
go func() {
defer wg.Done()
// travail
}()
wg.Wait()