Sobes.tech
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.