Sobes.tech
Middle+

Cos'è un primitive di sincronizzazione Semaphore?

sobes.tech AI

Risposta dell'AI

Semaphore — è un primitive di sincronizzazione che controlla l'accesso a un pool limitato di risorse. Tiene traccia di un contatore che determina quanti thread possono accedere contemporaneamente alla risorsa.

Operazioni principali:

  • WaitOne (o WaitAsync per codice asincrono): Diminuisce il contatore se è maggiore di zero. Se il contatore è zero, il thread si blocca fino a quando il contatore diventa positivo (un altro thread chiama Release).
  • Release: Incrementa il contatore e può sbloccare il thread in attesa.

Tipi di Semaphore:

  • Semaphore: Sistema (con nome o senza), può essere usato tra processi.
  • SemaphoreSlim: Implementazione leggera, progettata per l'uso all'interno di un processo. Preferibile per la sincronizzazione intra-processo.

Esempio di utilizzo di SemaphoreSlim:

// semaphoreSlim può essere usato per limitare l'accesso simultaneo a una risorsa
// In questo caso, sono consentiti 2 thread contemporaneamente
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // Attende che il semaforo venga rilasciato
    await semaphoreSlim.WaitAsync();
    try
    {
        // Accesso alla risorsa limitata
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} accede alla risorsa");
        await Task.Delay(1000); // Simulazione di lavoro con la risorsa
    }
    finally
    {
        // Rilascia il semaforo
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} rilascia la risorsa");
        semaphoreSlim.Release();
    }
}