Junior — Middle
Qual è la funzione del meccanismo del semaforo nella programmazione multithread?
sobes.tech AI
Risposta dell'AI
Un semaforo nella programmazione multithread viene utilizzato per gestire l'accesso alle risorse condivise, limitando il numero di thread che possono utilizzare questa risorsa contemporaneamente. Tiene un contatore che diminuisce quando si acquisisce la risorsa e aumenta quando si rilascia. Se il contatore è zero, i nuovi thread vengono bloccati fino a quando la risorsa non viene rilasciata.
Esempio in Go usando un canale come semaforo:
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
sem := make(chan struct{}, 3) // semaforo con contatore massimo 3
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
sem <- struct{}{} // acquisizione della risorsa
fmt.Printf("Goroutine %d ha iniziato a lavorare\n", id)
// simulazione di lavoro
// time.Sleep(time.Second)
fmt.Printf("Goroutine %d ha finito di lavorare\n", id)
<-sem // rilascio della risorsa
}(i)
}
wg.Wait()
}
In questo modo, il semaforo aiuta a controllare l'accesso concorrente e previene condizioni di gara e sovraccarico delle risorse.