Sobes.tech
Middle+

Čo je to synchronizačný primitív Semaphore?

sobes.tech AI

Odpoveď od AI

Semaphore — je primitives synchronizácie, ktorý riadi prístup k obmedzenému poolu zdrojov. Udržiava čítač, ktorý určuje, koľko vlákien môže súčasne získať prístup ku zdroju.

Hlavné operácie:

  • WaitOne (alebo WaitAsync pre asynchrónny kód): Znižuje čítač, ak je väčší ako nula. Ak je čítač nulový, vlákno je zablokované, kým čítač nebude kladný (iné vlákno zavolá Release).
  • Release: Zvyšuje čítač a môže odblokovať čakajúce vlákno.

Typy Semaphore:

  • Semaphore: Systémový (s názvom alebo bez), môže byť použitý medzi procesmi.
  • SemaphoreSlim: Ľahká implementácia, určená na použitie vnútri procesu. Preferovaná pre intra-procesovú synchronizáciu.

Príklad použitia SemaphoreSlim:

// semaphoreSlim môže byť použitý na obmedzenie súčasného prístupu ku zdroju
// V tomto prípade je povolené 2 vlákna súčasne
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // Čaká na uvoľnenie semaforu
    await semaphoreSlim.WaitAsync();
    try
    {
        // Prístup k obmedzenému zdroju
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} pristupuje ku zdroju");
        await Task.Delay(1000); // Simulácia práce so zdrojom
    }
    finally
    {
        // Uvoľňuje semafor
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}} uvoľňuje zdroj");
        semaphoreSlim.Release();
    }
}