Sobes.tech
Middle

Explica qué es una carrera de datos en el contexto del desarrollo multihilo.

sobes.tech AI

Respuesta de la IA

La carrera de datos es un estado en el que varios hilos o procesos acceden simultáneamente a la misma área de memoria (una variable, un objeto) y al menos uno de ellos realiza una escritura, sin ninguna sincronización de acceso.

Las consecuencias de la carrera de datos son impredecibles y pueden incluir:

  • Valores incorrectos de las variables.
  • Fallos en la aplicación.
  • Otros errores difíciles de detectar.

Ejemplo de carrera de datos en Swift:

// Contador sin protección
var counter = 0

// Función que incrementa el contador en un hilo
func incrementCounter() {
    for _ in 0..<1000 {
        counter += 1 // Aquí ocurre una carrera de datos
    }
}

// Creación y ejecución de varios hilos
let queue = DispatchQueue.global()
queue.async {
    incrementCounter()
}

queue.async {
    incrementCounter()
}

// Como resultado, counter puede no ser igual a 2000

Formas de prevenir la carrera de datos:

  • Bloqueos (Locks): NSLock, os_unfair_lock.
  • Mutexes: Usados con pthread_mutex.
  • Semáforos: DispatchSemaphore.
  • Colas concurrentes con barreras: DispatchQueue(label: "myQueue", attributes: .concurrent) con la bandera .barrier al escribir.
  • Synchronized (Objective-C): @synchronized.
  • Operaciones atómicas: Uso de tipos atómicos, como AtomicBool.
  • Estructuras de datos seguras para acceso concurrente: Por ejemplo, NSCache o bibliotecas especializadas.