Sobes.tech
Middle+

Czym jest primitive synchronizacji Semaphore?

sobes.tech AI

Odpowiedź od AI

Semaphore — to prymityw synchronizacji, który zarządza dostępem do ograniczonej puli zasobów. Posiada licznik, który określa, ile wątków może jednocześnie uzyskać dostęp do zasobu.

Główne operacje:

  • WaitOne (lub WaitAsync dla kodu asynchronicznego): Zmniejsza licznik, jeśli jest większy od zera. Jeśli licznik jest równy zero, wątek jest blokowany do czasu, aż licznik stanie się dodatni (inny wątek wywoła Release).
  • Release: Zwiększa licznik i może odblokować oczekujący wątek.

Typy Semaphore:

  • Semaphore: Systemowy (z nazwą lub bez), może być używany między procesami.
  • SemaphoreSlim: Lekka implementacja, przeznaczona do użytku wewnątrz procesu. Preferowana do synchronizacji wewnątrzprocesowej.

Przykład użycia SemaphoreSlim:

// semaphoreSlim może być używany do ograniczenia jednoczesnego dostępu do zasobu
// W tym przypadku dozwolone są 2 wątki jednocześnie
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // Czeka na zwolnienie semafora
    await semaphoreSlim.WaitAsync();
    try
    {
        // Dostęp do ograniczonego zasobu
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} uzyskuje dostęp do zasobu");
        await Task.Delay(1000); // Symulacja pracy z zasobem
    }
    finally
    {
        // Zwolnienie semafora
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} zwalnia zasób");
        semaphoreSlim.Release();
    }
}