Sobes.tech
Middle+

O que será exibido ao executar o programa: 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) // Simulação de trabalho }() } wg.Wait() fmt.Println(len(counter)) }

sobes.tech IA

Resposta da IA

O programa contém uma corrida de dados ao escrever no segmento counter de várias goroutines sem sincronização. Isso leva a um comportamento imprevisível.

O que acontece:

  • Um segmento counter é criado com comprimento 0 e capacidade de 1000.
  • São lançadas 1000 goroutines, cada uma tentando adicionar o valor i ao segmento.
  • A operação append não é segura para threads, várias goroutines modificam o segmento simultaneamente.
  • Devido à corrida de dados, pode haver perda de dados, corrupção do segmento ou pânico.

No final:

  • O valor de len(counter) pode ser menor que 1000, pois algumas entradas podem ser perdidas.
  • Pode ocorrer um pânico ou uma saída incorreta.

A abordagem correta é usar um mutex ou um canal para sincronizar o acesso ao segmento:

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)
}

Ou usar estruturas de dados seguras para threads.