typestar

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

  1. count++ es una lectura, una suma y una escritura.
  2. Corre las pruebas con -race para que el runtime la atrape.
  3. El arreglo es un mutex o un atómico, no la esperanza.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 3 de 3 en Goroutines; paso 3 de 25 en Concurrencia.

← Anterior Siguiente →