Una condición de carrera es un bug donde el resultado depende del temporizado impredecible de operaciones concurrentes que acceden a un estado compartido. El caso clásico es una lectura-modificación-escritura que no es atómica.
Cómo funciona
counter += 1 parece atómico pero en realidad son tres pasos: leer, sumar, escribir. Dos hilos pueden entrelazarse de modo que se pierda una actualización.
counter = 0
Thread A: read 0 ─────────── write 1
Thread B: read 0 ─ write 1
Result: 1 (should be 2 — one increment lost)
