Sobes.tech
Junior — Middle

Pode explicar o princípio de funcionamento do semáforo na programação multithread?

sobes.tech IA

Resposta da IA

Um semáforo é um mecanismo de sincronização na programação multithread que controla o acesso a um recurso compartilhado. Ele contém um contador que indica quantos threads podem aceder ao recurso simultaneamente.

Princípio de funcionamento:

  • Inicialmente, o contador do semáforo é definido para um número igual ao número de recursos disponíveis.
  • Quando um thread quer aceder, chama a operação "wait" (ou "acquire"), que diminui o contador em 1.
  • Se o contador ficar menor que zero, o thread fica bloqueado e espera até que outro thread libere o recurso.
  • Quando um thread liberta o recurso, chama a operação "signal" (ou "release"), que aumenta o contador em 1 e desbloqueia os threads em espera.

Exemplo em Swift usando DispatchSemaphore:

let semaphore = DispatchSemaphore(value: 2) // permitimos 2 threads ao mesmo tempo

DispatchQueue.global().async {
    semaphore.wait() // tenta aceder
    print("Thread começou a trabalhar")
    sleep(2) // simulação de trabalho
    print("Thread terminou de trabalhar")
    semaphore.signal() // liberta o recurso
}

Desta forma, o semáforo ajuda a limitar o número de threads que trabalham simultaneamente com um recurso compartilhado, prevenindo condições de corrida e garantindo a integridade dos dados.