Sobes.tech
Junior — Middle

Puoi spiegare il principio di funzionamento di un semaforo nella programmazione multithread?

sobes.tech AI

Risposta dell'AI

Un semaforo è un meccanismo di sincronizzazione nella programmazione multithread che controlla l'accesso a una risorsa condivisa. Contiene un contatore che indica quanti thread possono accedere contemporaneamente alla risorsa.

Principio di funzionamento:

  • Inizialmente, il contatore del semaforo viene impostato su un numero uguale al numero di risorse disponibili.
  • Quando un thread desidera accedere, chiama l'operazione "wait" (o "acquire"), che diminuisce il contatore di 1.
  • Se il contatore diventa inferiore a zero, il thread si blocca e aspetta che un altro thread liberi la risorsa.
  • Quando un thread libera la risorsa, chiama l'operazione "signal" (o "release"), che aumenta il contatore di 1 e sblocca i thread in attesa.

Esempio in Swift usando DispatchSemaphore:

let semaphore = DispatchSemaphore(value: 2) // permettiamo 2 thread contemporaneamente

DispatchQueue.global().async {
    semaphore.wait() // tentiamo di accedere
    print("Il thread ha iniziato a lavorare")
    sleep(2) // simulazione di lavoro
    print("Il thread ha finito di lavorare")
    semaphore.signal() // liberiamo la risorsa
}

In questo modo, il semaforo aiuta a limitare il numero di thread che lavorano contemporaneamente con una risorsa condivisa, prevenendo condizioni di race e garantendo l'integrità dei dati.