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(lubWaitAsyncdla 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łaRelease).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();
}
}