Megosztás a következőn keresztül:


Semaphore és SemaphoreSlim

Az System.Threading.Semaphore osztály egy nevezett (rendszerszintű) vagy helyi szemafort jelöl. Ez egy vékony burkoló a Win32 szemaphore objektum körül. A Win32-szemaforok a szemaforokat számolják, amelyek az erőforrások készletéhez való hozzáférés szabályozására használhatók.

Az SemaphoreSlim osztály egy egyszerű, gyors szemafortot jelöl, amely egyetlen folyamaton belül történő várakozásra használható, ha a várakozási idő várhatóan nagyon rövid lesz. SemaphoreSlim a lehető legnagyobb mértékben támaszkodik a közös nyelvi futtatókörnyezet (CLR) által biztosított szinkronizálási primitívekre. Ugyanakkor a rendszermagalapú, lazián inicializált várakozási fogópontokat is biztosít, ha szükséges, hogy több szemaphoron is várakozni tudjanak. SemaphoreSlim A lemondási tokenek használatát is támogatja, de nem támogatja a nevesített szemaforokat vagy a szinkronizáláshoz használt várakozási objektumot.

Korlátozott erőforrás kezelése

A szálak a WaitOne metódus meghívásával lépnek be a szemaforba, ami örökölt az WaitHandle osztálytól egy System.Threading.Semaphore objektum esetén, vagy pedig a SemaphoreSlim.Wait vagy SemaphoreSlim.WaitAsync metódussal, egy SemaphoreSlim objektum esetén. Amikor a hívás visszatér, a szemafor értéke csökkentésre kerül. Amikor egy szál bejegyzést kér, és a darabszám nulla, a szál blokkolódik. Ahogy a szálak felszabadítják a szemafort a Semaphore.Release vagy SemaphoreSlim.Release metódus meghívása által, a blokkolt szálak beléphetnek. A blokkolt szálaknak nincs garantált sorrendje, például az elsőként jött, elsőként távozik (FIFO) vagy az utolsóként jött, elsőként távozik (LIFO), amikor belépnek a szemaforba.

Egy szál többször is be tud lépni a szemaforba az System.Threading.Semaphore objektum metódusának WaitOne vagy az SemaphoreSlim objektum metódusának ismételt meghívásával Wait . A szemafor felszabadításához a szál vagy annyiszor hívja meg a Semaphore.Release() vagy SemaphoreSlim.Release() metódusokat, ahány bejegyzést fel akar szabadítani, vagy hívja meg a Semaphore.Release(Int32) vagy SemaphoreSlim.Release(Int32) metódus túlterhelést, és adja meg a felszabadítandó bejegyzések számát.

Szemaforok és szálazonosság

A két szemaphore-típus nem kényszeríti ki a szálidentitást a WaitOne, Wait, Releaseés SemaphoreSlim.Release metódusok hívásaihoz. A szemaforok gyakori használati forgatókönyve például egy gyártó szál és egy fogyasztó szál, ahol az egyik szál mindig növeli a szemafor számlálót, a másik pedig mindig csökkenti azt.

A programozó felelőssége annak biztosítása, hogy egy szál ne oldja fel túl gyakran a szemafort. Tegyük fel például, hogy a szemaforok maximális száma kettő, és az A és a B szál egyaránt a szemaforba kerül. Ha a B szál programozási hibája miatt kétszer meghívja a Release-t, mindkét hívás sikeres lesz. A szemafor számlálója megtelt, és amikor az A szál végül meghívja Release, egy SemaphoreFullException kivétel dobódik.

Névvel ellátott Szemaforok

A Windows operációs rendszer lehetővé teszi a szemaphorok számára, hogy neveket használjanak. A névvel ellátott szemafor rendszerszintű. Miután a névvel ellátott szemafort létrehozták, az látható az összes folyamat összes szála számára. Így a nevesített szemafor használható a folyamatok és szálak tevékenységeinek szinkronizálására.

A névvel ellátott konstruktorok egyikével olyan objektumot Semaphore hozhat létre, amely egy elnevezett rendszerszemort jelöl.

Megjegyzés:

Mivel a nevesített szemaphorok rendszerszintűek, több Semaphore objektum is lehet, amelyek ugyanazt a nevesített szemaphore-t jelölik. Minden alkalommal, amikor konstruktort vagy metódust Semaphore.OpenExisting hív meg, egy új Semaphore objektum jön létre. Ha ugyanazt a nevet adja meg, több objektumot hoz létre, amelyek ugyanazt a névvel ellátott szemaphore-t jelölik.

Legyen óvatos, amikor megnevezett szemaforokat használ. Mivel rendszerszintűek, egy másik folyamat, amely ugyanazt a nevet használja, váratlanul beléphet a szemaforba. Az ugyanazon a számítógépen futtatott rosszindulatú kód ezt használhatja szolgáltatásmegtagadásos támadás alapjául.

A hozzáférés-vezérlési biztonság használatával megvédhet egy Semaphore elnevezett szemapórát képviselő objektumot, lehetőleg egy objektumot meghatározó System.Security.AccessControl.SemaphoreSecurity konstruktor használatával. A hozzáférés-vezérlési biztonságot is alkalmazhatja a Semaphore.SetAccessControl módszerrel, de ez biztonsági rést hagy a szemapó létrehozása és a védelem ideje között. A szemaphorok hozzáférés-vezérlési biztonsággal való védelme segít megelőzni a rosszindulatú támadásokat, de nem oldja meg a véletlen névütközések problémáját.

Lásd még