Sobes.tech
Middle

¿En qué se basan los bloqueos y semáforos?

sobes.tech AI

Respuesta de la IA

Las barreras y semáforos en el contexto de la programación paralela se basan en mecanismos de sincronización:

  • Semáforos: Se basan en operaciones atómicas sobre un contador. Operaciones principales:

    • wait (o P, adquirir): Decrementa el contador. Si el contador se vuelve negativo, el hilo se bloquea hasta que otro hilo realice signal.
    • signal (o V, liberar): Incrementa el contador. Si hay hilos bloqueados, uno de ellos se despierta.
    • Los semáforos pueden ser binarios (valor 0 o 1, actúan como mutexes) o contables (permiten que un número limitado de hilos accedan a un recurso).
  • Barreras: Se basan en un mecanismo de espera por todos los participantes. Un hilo que alcanza la barrera se bloquea hasta que todos los demás hilos involucrados en la sincronización también lleguen a esa barrera. Una vez que todos alcanzan la barrera, continúan simultáneamente.

En el desarrollo de iOS/macOS, estos conceptos se implementan usando frameworks de programación concurrente, como GCD (Grand Central Dispatch) y OperationQueue.

Por ejemplo, en GCD:

// Ejemplo de uso de DispatchSemaphore
let semaphore = DispatchSemaphore(value: 1) // Semáforo binario

// Wait (adquirir)
semaphore.wait()
// Acceso a la sección crítica
semaphore.signal() // Signal (liberar)

Las barreras en GCD se implementan mediante tareas barrera (barrier tasks) para colas concurrentes:

let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

// Tareas normales
concurrentQueue.async {
    // ...
}

// Tarea barrera - se ejecuta solo cuando todas las tareas normales anteriores han finalizado
// Y después de esto, ninguna tarea nueva comenzará hasta que termine
concurrentQueue.async(flags: .barrier) {
    // ...
}

// Tareas normales que comenzarán después de que la tarea barrera finalice
concurrentQueue.async {
    // ...
}