Sobes.tech
Middle+

Mi az a szinkronizációs primitív Semaphore?

sobes.tech MI

Válasz az MI-től

Semaphore — ez egy szinkronizációs primitív, amely szabályozza a hozzáférést egy korlátozott erőforráskészlethez. Egy számlálót tart fenn, amely meghatározza, hány szál férhet hozzá egyidejűleg az erőforráshoz.

Fő műveletek:

  • WaitOne (vagy WaitAsync aszinkron kódhoz): Csökkenti a számlálót, ha az nagyobb nullánál. Ha a számláló nulla, a szál blokkolódik, amíg a számláló pozitív nem lesz (egy másik szál meghívja a Release-t).
  • Release: Növeli a számlálót, és feloldhatja a várakozó szálat.

Semaphore típusok:

  • Semaphore: Rendszerszintű (névvel vagy név nélkül), folyamatok között használható.
  • SemaphoreSlim: Könnyűsúlyú implementáció, belső folyamaton belüli szinkronizációra tervezték. Előnyösebb az intra-folyamat szinkronhoz.

Példa a SemaphoreSlim használatára:

// semaphoreSlim használható a párhuzamos hozzáférés korlátozására egy erőforráshoz
// Ebben az esetben 2 szál férhet hozzá egyszerre
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // Várakozik a semaphore felszabadulására
    await semaphoreSlim.WaitAsync();
    try
    {
        // Hozzáférés a korlátozott erőforráshoz
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} hozzáfér az erőforráshoz");
        await Task.Delay(1000); // Munka szimulálása az erőforrással
    }
    finally
    {
        // Felszabadítja a semafort
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} felszabadítja az erőforrást");
        semaphoreSlim.Release();
    }
}