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.