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(vagyWaitAsyncaszinkron 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 aRelease-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();
}
}