Sobes.tech
Middle+

¿Qué se mostrará al ejecutar el 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) // Simulación de trabajo }() } wg.Wait() fmt.Println(len(counter)) }

sobes.tech AI

Respuesta de la IA

El programa contiene una carrera de datos al escribir en el segmento counter desde varias goroutines sin sincronización. Esto conduce a un comportamiento impredecible.

Lo que sucede:

  • Se crea un segmento counter con longitud 0 y capacidad 1000.
  • Se lanzan 1000 goroutines, cada una intenta agregar el valor i al segmento.
  • La operación append no es segura para hilos, varias goroutines modifican el segmento simultáneamente.
  • Debido a la carrera de datos, puede haber pérdida de datos, corrupción del segmento o pánico.

Al final:

  • El valor de len(counter) puede ser menor que 1000, ya que algunas entradas pueden perderse.
  • Puede ocurrir un pánico o una salida incorrecta.

El enfoque correcto es usar un mutex o un canal para sincronizar el acceso al 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)
}

O usar estructuras de datos seguras para hilos.