Sobes.tech
Middle

O que é um semáforo no contexto da programação?

sobes.tech IA

Resposta da IA

O semáforo é uma primitiva de sincronização de threads que controla o acesso a um recurso limitado. Ele mantém um contador inteiro.

Operações principais:

  • wait() (ou P / adquirir) : Diminui o contador em 1. Se o contador ficar negativo, o thread fica bloqueado até que outro execute signal().
  • signal() (ou V / liberar) : Aumenta o contador em 1. Se houver threads bloqueados, um deles é desbloqueado.

Tipos de semáforos:

  • Semáforo binário (mutex) : O contador assume valores 0 ou 1. Usado para garantir exclusão mútua: apenas um thread pode acessar o recurso de cada vez.
  • Semáforo contável : O contador pode assumir valores de 0 a N. Usado para gerenciar o acesso a um pool de recursos com uma quantidade limitada de elementos disponíveis.

Exemplo de uso em Swift para limitar a quantidade de tarefas que podem ser executadas simultaneamente:

// Criar um semáforo que permite até 3 acessos simultâneos
let semaphore = DispatchSemaphore(value: 3)

DispatchQueue.global().async {
    // Tarefa 1
    semaphore.wait() // Diminui o contador, bloqueia se > 3 tarefas em execução
    print("Tarefa 1 iniciada")
    Thread.sleep(forTimeInterval: 2) // Simulação de trabalho
    print("Tarefa 1 finalizada")
    semaphore.signal() // Aumenta o contador, desbloqueia tarefas em espera
}

DispatchQueue.global().async {
    // Tarefa 2
    semaphore.wait()
    print("Tarefa 2 iniciada")
    Thread.sleep(forTimeInterval: 3)
    print("Tarefa 2 finalizada")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Tarefa 3
    semaphore.wait()
    print("Tarefa 3 iniciada")
    Thread.sleep(forTimeInterval: 1)
    print("Tarefa 3 finalizada")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Tarefa 4 (esperará até que um espaço seja liberado)
    semaphore.wait()
    print("Tarefa 4 iniciada")
    Thread.sleep(forTimeInterval: 2)
    print("Tarefa 4 finalizada")
    semaphore.signal()
}

// Esperar que todas as tarefas terminem para a demonstração
// Use mecanismos de espera mais confiáveis em código real
Thread.sleep(forTimeInterval: 5)