Sobes.tech
Junior — Middle

Puoi spiegare cos'è un semaforo nel contesto della programmazione e della sincronizzazione dei thread?

sobes.tech AI

Risposta dell'AI

Un semaforo è un meccanismo di sincronizzazione utilizzato per controllare l'accesso di più thread a una risorsa condivisa.

Contiene un contatore che indica quanti thread possono accedere contemporaneamente alla risorsa. Quando un thread desidera entrare nella sezione critica, tenta di "acquisire" il semaforo:

  • Se il contatore è maggiore di zero, viene decrementato di uno e il thread continua.
  • Se il contatore è zero, il thread si blocca e aspetta che un altro thread liberi il semaforo.

Quando un thread termina di usare la risorsa, rilascia il semaforo incrementando il contatore, permettendo ad altri thread di continuare.

Esempio di utilizzo di un semaforo in Swift (iOS):

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

DispatchQueue.global().async {
    semaphore.wait() // tenta di acquisire il semaforo
    print("Il thread ha iniziato a lavorare")
    sleep(2) // simulazione di lavoro
    print("Il thread ha finito di lavorare")
    semaphore.signal() // rilascia il semaforo
}

In questo modo, il semaforo aiuta a controllare il numero di thread che lavorano contemporaneamente con una risorsa condivisa, prevenendo condizioni di gara e garantendo la correttezza del funzionamento.