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.