Sobes.tech
Junior — Middle

Tudnál magyarázatot adni arra, hogy mi az a szemáfor és hogyan használják az erőforrások hozzáférésének ellenőrzésére?

sobes.tech MI

Válasz az MI-től

A szeminátor egy szinkronizációs mechanizmus, amelyet a közös erőforráshoz való hozzáférés ellenőrzésére használnak több szálas alkalmazásokban. Tartalmaz egy számlálót, amely megmutatja, hány szál férhet hozzá az erőforráshoz egyidejűleg.

Működési elv:

  • Kezdetben a számlálót a rendelkezésre álló erőforrások számára állítják (például 3).
  • Amikor egy szál hozzáférést szeretne, meghívja a Wait (vagy C#-ban WaitOne) műveletet, amely csökkenti a számlálót 1-gyel.
  • Ha a számláló kisebb lesz nullánál, a szál blokkolva lesz, és vár, amíg az erőforrás felszabadul.
  • Amikor egy szál felszabadítja az erőforrást, meghívja a Release-t, növelve a számlálót, és feloldva a várakozó szálakat.

C# példakód:

using System;
using System.Threading;

class Program
{
    static Semaphore semaphore = new Semaphore(3, 3); // maximum 3 szál egyszerre

    static void AccessResource(int id)
    {
        Console.WriteLine($"Szál {id} vár a hozzáférésre");
        semaphore.WaitOne(); // hozzáférés kérés
        Console.WriteLine($"Szál {id} hozzáférést kapott");
        Thread.Sleep(1000); // munka az erőforrással
        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();
        }
    }
}

Így a szeminátor korlátozza az egyszerre az erőforrással dolgozó szálak számát, megelőzi a versenyhelyzeteket, és biztosítja a helyes működést.