Sobes.tech
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.