¿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(oP,adquirir): Decrementa el contador. Si el contador se vuelve negativo, el hilo se bloquea hasta que otro hilo realicesignal.signal(oV,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 {
// ...
}