Junior — Middle
Spiega il principio di funzionamento del meccanismo di sincronizzazione delle goroutine nel contesto dell'esecuzione concorrente di compiti.
sobes.tech AI
Risposta dell'AI
In Go, le goroutine sono thread leggeri che vengono eseguiti in modo concorrente. Per sincronizzare le goroutine, si utilizzano meccanismi che consentono di coordinare l'accesso alle risorse condivise e di ordinare l'esecuzione.
Principali meccanismi di sincronizzazione:
- Canali (channels): permettono di trasmettere dati tra goroutine, garantendo la sincronizzazione tramite scambio di messaggi.
- Mutex (sync.Mutex): bloccano l'accesso ai dati condivisi per evitare condizioni di race.
- WaitGroup (sync.WaitGroup): permette di attendere la conclusione di un gruppo di goroutine.
Esempio con canale:
package main
import (
"fmt"
)
func worker(ch chan int) {
val := <-ch // attende dati dal canale
fmt.Println("Valore ricevuto:", val)
}
func main() {
ch := make(chan int)
go worker(ch)
ch <- 42 // invia dati al canale
}
Qui, il canale garantisce la sincronizzazione: la goroutine worker aspetta che main invii un valore.