Definición
Un fallo de concurrencia en el que el comportamiento o resultado del programa depende del orden o temporización relativa de operaciones sobre recursos compartidos, de modo que distintos intercalados producen resultados distintos, algunos incorrectos o inseguros.

Principio

Principio
Cuando múltiples agentes concurrentes (hilos, procesos, interrupciones) acceden y al menos uno modifica estado compartido sin sincronización adecuada, la falta de un orden definido hace que los resultados sean no deterministas y sensibles al planificador, caches o I/O.

Demostración

Demostración
Dos hilos incrementan un contador compartido leyendo, incrementando y escribiendo sin operaciones atómicas ni bloqueos; los intercalados pueden perder incrementos (lost updates). Un TOCTOU clásico ocurre cuando se comprueba la existencia de un archivo y luego se usa, mientras otro hilo cambia el archivo entre la comprobación y el uso.

Aplicación incorrecta

Aplicación incorrecta
Llamar 'condición de carrera' a cualquier fallo intermitente sin demostrar interacciones dependientes del tiempo, o asumir que añadir sleeps reproducirá o arreglará el problema; también creer que los locks eliminan siempre el riesgo sin considerar deadlocks o inversión de prioridad.

Consecuencia

Consecuencia
Reconocer correctamente condiciones de carrera conduce a sincronización apropiada (locks, atómicos, transacciones) o rediseño hacia la inmutabilidad, produciendo comportamiento determinista; sin resolver causan fallos intermitentes, corrupción de datos o vulnerabilidades difíciles de reproducir.

Inversión

Inversión
Serializar el acceso al recurso compartido, usar primitivos atómicos, paso de mensajes o diseñar estructuras de datos inmutables revierte la no determinación al imponer un orden bien definido o eliminar el estado mutable compartido.

Límite

Límite
Incluye data races y condiciones de carrera de más alto nivel; se distingue de deadlock y livelock (donde el progreso se detiene o gira en vacío) y del nondeterminismo puramente algorítmico que no proviene de accesos compartidos no sincronizados.

Tensión semántica

Tensión semántica
Hay tensión entre 'data race' (acceso a memoria de bajo nivel no sincronizado) y la 'race condition' más amplia (que puede incluir orden de operaciones de nivel superior). También hay tensión al atribuir nondeterminismo observado a concurrencia frente a causas ambientales.

Síntesis

Síntesis
Una condición de carrera es un fallo sensible al tiempo en concurrencia donde el acceso no sincronizado a estado compartido produce resultados no deterministas y posiblemente incorrectos; se demuestra con updates perdidos o TOCTOU, se malatribuye si no se muestra el timing, y se aborda con sincronización, atómicos o cambios de diseño que restauran el determinismo.