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(oWaitAsyncper 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 chiamaRelease).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();
}
}