Senior
Quali primitive di sincronizzazione conosci?
sobes.tech AI
Risposta dell'AI
In Go, ci sono diverse primitive di sincronizzazione principali per gestire l'accesso concorrente alle risorse:
- Mutex (sync.Mutex) — garantisce esclusione mutua, bloccando l'accesso alla sezione critica.
- RWMutex (sync.RWMutex) — mutex esteso che permette a più lettori di leggere contemporaneamente, ma blocca la scrittura.
- WaitGroup (sync.WaitGroup) — permette di attendere che un gruppo di goroutine finisca.
- Cond (sync.Cond) — variabile condizionale per notificare alle goroutine che si è verificato un evento.
- Operazioni atomiche (sync/atomic) — operazioni di basso livello per la lettura e scrittura atomica delle variabili.
Inoltre, in Go si usano ampiamente canali (channels), che consentono di sincronizzare le goroutine e di trasmettere dati tra di loro senza usare mutex espliciti.
Esempio di utilizzo di Mutex:
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
defer mu.Unlock()
counter++
}
Esempio di utilizzo di WaitGroup:
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
// lavoro
}()
go func() {
defer wg.Done()
// lavoro
}()
wg.Wait()