Junior — Middle
Qual è il ruolo delle primitive di sincronizzazione nel linguaggio di programmazione Go?
sobes.tech AI
Risposta dell'AI
Le primitive di sincronizzazione in Go vengono utilizzate per gestire l'accesso alle risorse condivise e coordinare l'esecuzione delle goroutine, per evitare condizioni di gara e garantire la correttezza del programma.
Primitive principali:
- Mutex (sync.Mutex) — garantisce esclusione mutua, permettendo a una sola goroutine di eseguire la sezione critica alla volta.
- WaitGroup (sync.WaitGroup) — permette di attendere che un gruppo di goroutine finisca.
- Canale — canale per il trasferimento di dati tra goroutine, che è di per sé una potente primitive di sincronizzazione.
- RWMutex (sync.RWMutex) — permette a più goroutine di leggere i dati contemporaneamente, ma la scrittura blocca tutti.
Esempio di utilizzo di Mutex:
var mu sync.Mutex
var contatore int
func incrementa() {
mu.Lock()
defer mu.Unlock()
contatore++
}
In questo modo, le primitive di sincronizzazione aiutano a evitare conflitti nell'accesso parallelo ai dati e garantiscono un'interazione corretta tra le goroutine.