Szemaphore objektumok
A szemaphore objektum olyan szinkronizálási objektum, amely nulla és egy megadott maximális érték közötti számot tart fenn. A szám minden alkalommal csökken, amikor egy szál befejezi a várakozást a szemaphore objektumra, és minden alkalommal növekszik, amikor egy szál felszabadítja a szemaphore-t. Amikor a szám eléri a nullát, nem tud több szál sikeresen várni a szemaphore objektum állapotának jelzésére. A szemaphore állapota akkor lesz jelezve, ha a száma nagyobb, mint nulla, és nem lesz aláírva, ha a száma nulla.
A szemaphore objektum olyan megosztott erőforrás vezérlésében hasznos, amely korlátozott számú felhasználót támogat. Kapuként működik, amely korlátozza az erőforrást megosztó szálak számát egy megadott maximális számra. Egy alkalmazás például korlátozhatja az általa létrehozott ablakok számát. Egy olyan szemafortot használ, amelynek maximális száma megegyezik az ablakkorláttal, csökkentve a darabszámot, amikor létrejön egy ablak, és növeli azt, amikor bezár egy ablakot. Az alkalmazás megadja az egyes ablakok létrehozása előtt várakozási függvények egyikének hívásában szereplő szemaphore objektumot. Ha a szám nulla – ami azt jelzi, hogy elérte az ablakkorlátot – a várakozási függvény letiltja az ablaklétrehozási kód végrehajtását.
A szál a CreateSemaphore vagy CreateSemaphoreEx függvényt használja szemafor objektum létrehozásához. A létrehozási szál megadja az objektum kezdeti számát és maximális számát. A kezdeti szám nem lehet kisebb nullánál, és nem lehet nagyobb a maximális értéknél. A létrehozási szál a szemaphore objektum nevét is megadhatja. Más folyamatok szálai megnyithatnak egy leírót egy meglévő szemaphore-objektum számára, ha megadják a nevét az OpenSemaphore függvény hívásában. További információ a mutex-, esemény-, szemaphore- és időzítőobjektumok nevéről: folyamatközi szinkronizálási.
Ha egynél több szál várakozik egy szemaforon, a rendszer kiválaszt egy várakozó szálat. Ne feltételezze az első, első utáni (FIFO) sorrendet. A külső események, például a kernel módú API-k módosíthatják a várakozási sorrendet.
Minden alkalommal, amikor a várakozási függvények egyike ad vissza, mert a szemafor állapota jelzésre lett állítva, a szemaphore száma egy-egyel csökken. A ReleaseSemaphore függvény egy adott mennyiséggel növeli a szemaforok számát. A darabszám soha nem lehet kisebb nullánál vagy nagyobb a maximális értéknél.
A szemaphore kezdeti száma általában a maximális értékre van állítva. A szám ezután csökken ebből a szintből a védett erőforrás felhasználásakor. Másik lehetőségként létrehozhat egy nulla kezdeti számmal rendelkező szemafort, amely letiltja a védett erőforráshoz való hozzáférést az alkalmazás inicializálása során. Az inicializálás után a ReleaseSemaphore használatával a szám a maximális értékre növelhető.
A mutex objektumot birtokban lévő szál ismétlődően várakozhat, amíg ugyanaz a mutex-objektum jelzé válik anélkül, hogy a végrehajtás le lett tiltva. Egy szál, amely ugyanarra a szemafor objektumra ismétlődően várakozik, azonban a várakozási művelet minden egyes befejezésekor megcáfli a szemapóra számát; a szál le lesz tiltva, amikor a szám nullára kerül. Hasonlóképpen, csak a mutexet birtokló szál tudja sikeresen meghívni a ReleaseMutex függvényt, bár bármely szál használhatja ReleaseSemaphore egy szemaphore objektum számának növeléséhez.
Egy szál többször is megcáfíthatja egy szemapóre számát, ha ugyanazt a szemafor objektumot ismételten megadja a várakozási függvényekhívásaiban. A több objektumból álló várakozási függvények egyikének olyan tömbbel való meghívása azonban, amely ugyanannak a szemafornak több fogópontját tartalmazza, nem eredményez több decrements értéket.
Ha befejezte a szemaphore objektum használatát, a leíró bezárásához hívja meg a CloseHandle függvényt. A szemaphore objektum megsemmisül, amikor az utolsó fogópontját lezárták. A fogópont bezárása nem befolyásolja a szemaforok számát; ezért mindenképpen hívja meg ReleaseSemaphore a leíró bezárása vagy a folyamat leállása előtt. Ellenkező esetben a függőben lévő várakozási műveletek időtúllépéssel vagy határozatlan ideig folytatódnak attól függően, hogy meg van-e adva egy időtúllépési érték.
Kapcsolódó témakörök