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#-banWaitOne) 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.