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
countercon longitud 0 y capacidad 1000. - Se lanzan 1000 goroutines, cada una intenta agregar el valor
ial segmento. - La operación
appendno 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.