Sobes.tech
Middle

¿Qué hace la sincronización en el contexto de la multitarea?

sobes.tech AI

Respuesta de la IA

La sincronización en el contexto de la multitarea previene condiciones de carrera y garantiza un acceso coherente a recursos compartidos (variables, archivos, conexiones de red) desde diferentes hilos.

Los mecanismos principales de sincronización:

  • Mutex (mutua exclusión): Solo un hilo puede poseer el mutex y acceder al recurso protegido.
  • Semaphore (semaforo): Limita la cantidad de hilos que pueden acceder simultáneamente a un recurso. Funciona con un contador.
  • Lock (bloqueo): Concepto generalizado, a menudo usado para referirse a mutex u otros mecanismos que bloquean completamente el acceso.
  • Dispatch Queue (cola de despacho): En Grand Central Dispatch (GCD), las colas pueden ser secuenciales (serial) o concurrentes, asegurando sincronización mediante el control del orden y la cantidad de tareas que se ejecutan simultáneamente. Las colas secuenciales garantizan la ejecución de tareas una por una, lo que inherentemente proporciona sincronización para los datos a los que solo se accede desde las tareas de esa cola.

Principio de funcionamiento: Un hilo que desea acceder a un recurso compartido intenta primero adquirir un bloqueo (obtener lock). Si el recurso está libre, el hilo obtiene el bloqueo y trabaja con el recurso. Al terminar, libera el bloqueo (release lock). Si el recurso está ocupado, otros hilos se bloquean (esperan) hasta que el recurso se libere.

Ejemplo de uso de mutex para proteger una sección crítica:

// Ejemplo en Objective-C usando @synchronized
- (void)updateSharedResource {
    @synchronized (self) { // Bloqueo en el objeto self
        // Aquí se ejecuta la sección crítica
        // El acceso a sharedResource es seguro
        self.sharedResource++;
    } // El bloqueo se libera automáticamente al salir del bloque
}
// Ejemplo en Swift usando NSLock
let lock = NSLock()
var sharedCounter = 0

func incrementCounter() {
    lock.lock() // Intentamos adquirir el bloqueo
    // Sección crítica
    sharedCounter += 1
    lock.unlock() // Liberamos el bloqueo
}

La sincronización ayuda a evitar problemas como:

  • Corrupción de datos.
  • Deadlock (bloqueo mutuo) de hilos.
  • Livelock (bloqueos activos) de hilos.

La elección del mecanismo de sincronización adecuado depende de la naturaleza de la tarea y del tipo de recurso.