Sobes.tech
Junior — Middle

Magyarázza el, mi az a szemafor, és hogyan használják a szálak szinkronizálására.

sobes.tech MI

Válasz az MI-től

A szemafor egy szinkronizációs primitív, amelyet több szál által megosztott erőforrás hozzáférésének kezelésére használnak.

Tartalmaz egy számlálót, amely megmutatja, hány szál férhet hozzá az erőforráshoz egyidejűleg.

  • Ha a számláló nagyobb nullánál, a szál beléphet és csökkentheti a számlálót 1-gyel.
  • Ha a számláló nulla, a szál blokkolódik, és vár, amíg egy másik szál felszabadítja az erőforrást.

C#-ban a szeminárium a Semaphore vagy SemaphoreSlim osztállyal van reprezentálva.

A SemaphoreSlim használatának példája:

using System;
using System.Threading;

class Program
{
    static SemaphoreSlim semaphore = new SemaphoreSlim(2); // legfeljebb 2 szál egyszerre

    static void AccessResource(int id)
    {
        Console.WriteLine($"Szál {id} vár a hozzáférésre");
        semaphore.Wait(); // hozzáférés kérése
        Console.WriteLine($"Szál {id} megszerezte a hozzáférést");

        Thread.Sleep(1000); // erőforrással való munka szimulálása

        Console.WriteLine($"Szál {id} felszabadítja az erőforrást");
        semaphore.Release(); // erőforrás felszabadítása
    }

    static void Main()
    {
        for (int i = 1; i <= 5; i++)
        {
            int localId = i;
            new Thread(() => AccessResource(localId)).Start();
        }
    }
}

Ebben a példában legfeljebb két szál dolgozhat az erőforrással egyszerre, a többi várakozik a sorára.