Sobes.tech
Middle+

Šta je Semaphore primitiv za sinhronizaciju?

sobes.tech АИ

Одговор од АИ

Semaphore — to primitives za sinhronizaciju koja kontroliše pristup ograničenom bazenu resursa. Održava brojač koji određuje koliko niti može istovremeno pristupiti resursu.

Glavne operacije:

  • WaitOne (ili WaitAsync za asinhroni kod): Smanjuje brojač ako je veći od nule. Ako je brojač nula, nit se blokira dok brojač ne postane pozitivan (druga nit poziva Release).
  • Release: Povećava brojač i može otključati čekajuću nit.

Tipovi Semaphore:

  • Semaphore: Sistemskog (sa ili bez imena), može se koristiti između procesa.
  • SemaphoreSlim: Laka implementacija, namenjena za upotrebu unutar procesa. Preferira se za intra-procesnu sinhronizaciju.

Primer korišćenja SemaphoreSlim:

// semaphoreSlim može biti korišćen za ograničavanje istovremenog pristupa resursu
// U ovom slučaju, dozvoljena su 2 niti istovremeno
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // Čeka na oslobađanje semafora
    await semaphoreSlim.WaitAsync();
    try
    {
        // Pristup ograničenom resursu
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} pristupa resursu");
        await Task.Delay(1000); // Simulacija rada sa resursom
    }
    finally
    {
        // Oslobađa semafor
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} oslobađa resurs");
        semaphoreSlim.Release();
    }
}