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


Semaphore és SemaphoreSlim

Az System.Threading.Semaphore osztály egy elnevezett (systemwide) vagy helyi szemaphore-t 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 jogkivonatok használatát is támogatja, de nem támogatja a nevesített szemaphorokat vagy a szinkronizáláshoz használt várakozási leírót.

Korlátozott erőforrás kezelése

A szálak az osztálytól öröklő metódus meghívásával WaitOne lépnek be a szemaforba, objektum SemaphoreSlim.WaitSemaphoreSlim.WaitAsync vagy objektum esetén System.Threading.Semaphore pedig metódus eseténSemaphoreSlim.WaitHandle Amikor a hívás visszatér, a szemaphore száma csökken. Amikor egy szál bejegyzést kér, és a darabszám nulla, a szál blokkolódik. Ahogy a szálak feloldják a szemafort a Semaphore.Release metódus meghívásával SemaphoreSlim.Release , a blokkolt szálak beírhatók. A blokkolt szálaknak nincs garantált sorrendje, például a first-in, first-out (FIFO) vagy last-in, first-out (LIFO), hogy a blokkolt szálak belépjenek a szemaphore-ba.

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 szemapó felszabadításához a szál meghívhatja a Semaphore.Release() metódust vagy SemaphoreSlim.Release() a metódust túlterhelheti ugyanannak a hányszornak, vagy meghívhatja a Semaphore.Release(Int32) metódus SemaphoreSlim.Release(Int32) túlterhelését, és megadhatja a felszabadítandó bejegyzések számát.

Szemaphorok é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 szemaphorok gyakori használati forgatókönyve például egy gyártói szál és egy fogyasztói szál, amelynek egyik szála mindig növeli a szemaforok számát, a másik pedig folyamatosan csökken.

A programozó felelőssége annak biztosítása, hogy egy szál ne engedje túl sokszor 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álban programozási hiba miatt kétszer hívható Release meg, mindkét hívás sikeres lesz. A szemapóra száma megtelt, és amikor az A szál végül meghívja Release, SemaphoreFullException a leszakad.

Névvel ellátott Szemaphorok

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

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

Feljegyzé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, ha nevesített szemaphorokat használ. Mivel rendszerszintűek, egy másik folyamat, amely ugyanazt a nevet használja, váratlanul beírhatja a szemafortot. 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