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()(ouP/adquirir) : Diminui o contador em 1. Se o contador ficar negativo, o thread fica bloqueado até que outro executesignal().signal()(ouV/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)