Sobes.tech
Middle

Em que se baseiam as barreiras e semáforos?

sobes.tech IA

Resposta da IA

Barreiras e semáforos no contexto da programação paralela baseiam-se em mecanismos de sincronização:

  • Semáforos: Baseiam-se em operações atômicas sobre um contador. Operações principais:

    • wait (ou P, adquirir): Decrementa o contador. Se o contador ficar negativo, o thread fica bloqueado até que outro thread execute signal.
    • signal (ou V, libertar): Incrementa o contador. Se houver threads bloqueados, um deles é despertado.
    • Os semáforos podem ser binários (valor 0 ou 1, atuam como mutexes) ou contáveis (permitindo que um número limitado de threads aceda ao recurso).
  • Barreiras: Baseiam-se num mecanismo de espera por todos os participantes. Um thread que atinge a barreira fica bloqueado até que todos os outros threads envolvidos na sincronização também atinjam essa barreira. Assim que todos atingem a barreira, continuam simultaneamente.

No desenvolvimento para iOS/macOS, estes conceitos são implementados usando frameworks de programação concorrente, como GCD (Grand Central Dispatch) e OperationQueue.

Por exemplo, em GCD:

// Exemplo de uso de DispatchSemaphore
let semaphore = DispatchSemaphore(value: 1) // Semáforo binário

// Wait (adquirir)
semaphore.wait()
// Acesso à secção crítica
semaphore.signal() // Signal (libertar)

As barreiras em GCD são implementadas usando tarefas de barreira (barrier tasks) para filas concorrentes:

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

// Tarefas normais
concurrentQueue.async {
    // ...
}

// Tarefa de barreira - executa-se apenas quando todas as tarefas normais anteriores terminarem
// E após isso, nenhuma nova tarefa começará até que termine
concurrentQueue.async(flags: .barrier) {
    // ...
}

// Tarefas normais que começarão após a conclusão da tarefa de barreira
concurrentQueue.async {
    // ...
}