Sobes.tech
Junior — Middle

Podes explicar o que é um semáforo no contexto de programação e sincronização de threads?

sobes.tech IA

Resposta da IA

Um semáforo é um mecanismo de sincronização utilizado para controlar o acesso de múltiplos threads a um recurso compartilhado.

Ele contém um contador que indica quantos threads podem aceder ao recurso simultaneamente. Quando um thread quer entrar na secção crítica, tenta "capturar" o semáforo:

  • Se o contador for maior que zero, é decrementado em um, e o thread continua.
  • Se o contador for zero, o thread fica bloqueado e espera que outro libere o semáforo.

Quando um thread termina de usar o recurso, liberta o semáforo incrementando o contador, permitindo que outros threads continuem.

Exemplo de uso de semáforo em Swift (iOS):

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

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

Assim, o semáforo ajuda a controlar o número de threads a trabalhar simultaneamente com um recurso partilhado, prevenindo condições de corrida e garantindo a correção do funcionamento.