Junior — Middle
Em que situações é apropriado usar o mecanismo Semaphore para sincronização de threads?
sobes.tech IA
Resposta da IA
O mecanismo Semaphore (semáforo) é utilizado para limitar o número de threads que acedem simultaneamente a um recurso ou secção crítica.
É aconselhável usar um semáforo quando:
- É necessário limitar o número de operações simultâneas, por exemplo, acesso a um pool de conexões ou a um número limitado de ficheiros.
- É preciso controlar o paralelismo para evitar sobrecarga do sistema.
- É necessária sincronização entre threads, quando vários threads devem aguardar a libertação de um recurso.
No iOS, os semáforos são frequentemente utilizados para gerir tarefas assíncronas, por exemplo, para aguardar a conclusão de várias operações ou limitar o número de tarefas que são executadas simultaneamente.
Exemplo de uso do DispatchSemaphore em Swift:
let semaphore = DispatchSemaphore(value: 3) // máximo de 3 threads ao mesmo tempo
func accessResource() {
semaphore.wait() // diminui o contador, se for 0, o thread bloqueia
// Trabalho com o recurso
print("Thread acedeu")
sleep(1) // simulação de trabalho
semaphore.signal() // aumenta o contador, libertando espaço
}
for _ in 1...10 {
DispatchQueue.global().async {
accessResource()
}
}
Neste exemplo, no máximo 3 threads poderão trabalhar com o recurso ao mesmo tempo.