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