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.