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