La carrera, y el arreglo en Go
Un incremento sin proteger pierde actualizaciones; el detector de carreras lo encuentra.
// racy incrementa el mismo int desde varias goroutines: ejecuta con -race.
func racy(times int) int {
count := 0
var wg sync.WaitGroup
for range times {
wg.Go(func() { count++ })
}
wg.Wait()
return count
}
func safe(times int) int64 {
var count atomic.Int64
var wg sync.WaitGroup
for range times {
wg.Go(func() { count.Add(1) })
}
wg.Wait()
return count.Load()
}
Cómo funciona
count++es una lectura, una suma y una escritura.- Corre las pruebas con -race para que el runtime la atrape.
- El arreglo es un mutex o un atómico, no la esperanza.
Palabras clave y builtins usados aquí
forfuncintint64rangereturnvar
El intento, en números
- Líneas
- 20
- Caracteres a escribir
- 364
- Tokens
- 93
- Ritmo de tres estrellas
- 95 tpm
Al ritmo de tres estrellas de 95 tokens por minuto, este intento toma unos 59 segundos.
Paso 3 de 3 en Goroutines; paso 3 de 25 en Concurrencia.