Sobes.tech
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.