Sobes.tech
Middle+

Cosa verrà visualizzato all'esecuzione del programma: func main() { counter := make([]int, 0, 1000) var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func() { defer wg.Done() counter = append(counter, i) time.Sleep(10 * time.Millisecond) // Simulazione di lavoro }() } wg.Wait() fmt.Println(len(counter)) }

sobes.tech AI

Risposta dell'AI

Il programma contiene una race condition durante la scrittura nel slice counter da parte di più goroutine senza sincronizzazione. Questo porta a comportamenti imprevedibili.

Cosa succede:

  • Viene creato un slice counter con lunghezza 0 e capacità 1000.
  • Vengono avviate 1000 goroutine, ognuna tenta di aggiungere il valore i al slice.
  • L’operazione append non è thread-safe, più goroutine modificano il slice contemporaneamente.
  • A causa della race condition, possono verificarsi perdita di dati, corruzione del slice o panic.

Al termine:

  • Il valore di len(counter) può essere inferiore a 1000, poiché alcune voci possono essere perse.
  • Potrebbe verificarsi un panic o un output errato.

L’approccio corretto è usare un mutex o un canale per sincronizzare l’accesso al slice:

var mu sync.Mutex

for i := 0; i < 1000; i++ {
    wg.Add(1)
    go func(val int) {
        defer wg.Done()
        mu.Lock()
        counter = append(counter, val)
        mu.Unlock()
        time.Sleep(10 * time.Millisecond)
    }(i)
}

Oppure usare strutture dati thread-safe.