Sobes.tech
Middle+

Ce este un primitive de sincronizare Semaphore?

sobes.tech AI

Răspuns de la AI

Semaphore — este un primitiv de sincronizare care controlează accesul la un pool limitat de resurse. Menține un contor care determină câte fire pot accesa simultan resursa.

Operațiuni principale:

  • WaitOne (sau WaitAsync pentru cod asincron): Scade contorul dacă este mai mare decât zero. Dacă contorul este zero, firul de execuție este blocat până când contorul devine pozitiv (alt fir apelează Release).
  • Release: Crește contorul și poate debloca firul de așteptare.

Tipuri de Semaphore:

  • Semaphore: Sistemic (cu sau fără nume), poate fi utilizat între procese.
  • SemaphoreSlim: Implementare ușoară, destinată utilizării în interiorul unui proces. Preferabil pentru sincronizarea intra-proces.

Exemplu de utilizare a SemaphoreSlim:

// semaphoreSlim poate fi utilizat pentru a limita accesul simultan la o resursă
// În acest caz, sunt permise 2 fire în același timp
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // Așteaptă eliberarea semaforului
    await semaphoreSlim.WaitAsync();
    try
    {
        // Acces la resursa limitată
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} accesând resursa");
        await Task.Delay(1000); // Simulare de lucru cu resursa
    }
    finally
    {
        // Eliberează semaforul
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} eliberând resursa");
        semaphoreSlim.Release();
    }
}