Sobes.tech
Junior

¿Qué es una condición de carrera?

sobes.tech AI

Respuesta de la IA

El estado de carrera es un problema que surge en una aplicación multihilo o multiproceso, cuando la corrección del resultado depende del orden en que se ejecutan los hilos/procesos.

Generalmente ocurre cuando varios hilos acceden simultáneamente a recursos compartidos (variables, archivos, bases de datos) sin la sincronización adecuada.

Esto conduce a comportamientos impredecibles, errores y datos incorrectos.

Ejemplo: Dos hilos intentan aumentar una variable compartida al mismo tiempo.

var sharedCounter = 0

func incrementCounter() {
    let currentValue = sharedCounter // El hilo 1 lee 0
    // Algún retardo
    let newValue = currentValue + 1 // El hilo 1 calcula 1
    sharedCounter = newValue // El hilo 1 escribe 1
}

// Si el hilo 2 lee currentValue antes de que el hilo 1 escriba newValue:
func anotherIncrementCounter() {
    let currentValue = sharedCounter // El hilo 2 lee 0
    let newValue = currentValue + 1 // El hilo 2 calcula 1
    sharedCounter = newValue // El hilo 2 escribe 1
}

En este ejemplo, si ambos hilos se ejecutan simultáneamente sin sincronización, en última instancia sharedCounter puede convertirse en 1 en lugar del esperado 2.

Para prevenir condiciones de carrera, se utilizan mecanismos de sincronización:

  • Mutexes (Mutex): Bloquean el acceso a un recurso, permitiendo que solo un hilo esté en la sección crítica.
  • Semáforos (Semaphore): Limitan la cantidad de hilos que pueden acceder simultáneamente a un recurso.
  • Colas (Dispatch Queues en GCD): La ejecución de tareas se realiza de manera secuencial (para Colas Seriales) o con un nivel determinado de paralelismo (para Colas Concurrentes) con la posibilidad de sincronizar el acceso.
  • Bloqueos (Locks): Diversos tipos de bloqueos (por ejemplo, NSLock, NSRecursiveLock).
  • Operaciones atómicas (Atomic Operations): Garantizan que la operación (lectura, escritura, incremento) se realice de forma atómica, es decir, no puede ser interrumpida por otro hilo.

En el desarrollo de iOS, a menudo se utilizan Grand Central Dispatch (GCD) y Operation Queues para gestionar hilos y prevenir condiciones de carrera. Las Colas de Despacho Serial aseguran la sincronización automática de las tareas ejecutadas en esa cola.