Sobes.tech
Middle+

Co je to synchronizační primitiv Semaphore?

sobes.tech AI

Odpověď od AI

Semaphore — je primitives synchronizace, který řídí přístup k omezenému poolu zdrojů. Udržuje čítač, který určuje, kolik vláken může současně získat přístup ke zdroji.

Hlavní operace:

  • WaitOne (nebo WaitAsync pro asynchronní kód): Snižuje čítač, pokud je větší než nula. Pokud je čítač nulový, vlákno je zablokováno, dokud čítač nebude kladný (jiné vlákno zavolá Release).
  • Release: Zvyšuje čítač a může odblokovat čekající vlákno.

Typy Semaphore:

  • Semaphore: Systémový (s názvem nebo bez), může být použit mezi procesy.
  • SemaphoreSlim: Lehká implementace, určená pro použití uvnitř procesu. Preferováno pro intra-procesovou synchronizaci.

Příklad použití SemaphoreSlim:

// semaphoreSlim může být použit ke omezení současného přístupu ke zdroji
// V tomto případě je povoleno 2 vlákna současně
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // Čeká na uvolnění semaforu
    await semaphoreSlim.WaitAsync();
    try
    {
        // Přístup ke omezenému zdroji
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} přistupuje ke zdroji");
        await Task.Delay(1000); // Simulace práce se zdrojem
    }
    finally
    {
        // Uvolní semafor
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} uvolňuje zdroj");
        semaphoreSlim.Release();
    }
}