CSemaphore – třída
Objekt třídy CSemaphore
představuje "semaphore" – synchronizační objekt, který umožňuje omezený počet vláken v jednom nebo více procesech pro přístup k objektu Udržuje počet vláken, které aktuálně přistupují k zadanému prostředku.
Syntaxe
class CSemaphore : public CSyncObject
Členové
Veřejné konstruktory
Název | Popis |
---|---|
CSemaphore::CSemaphore | CSemaphore Vytvoří objekt. |
Poznámky
Semafory jsou užitečné při řízení přístupu ke sdílenému prostředku, který může podporovat pouze omezený počet uživatelů. Aktuální počet objektu CSemaphore
je počet povolených dalších uživatelů. Když počet dosáhne nuly, všechny pokusy o použití prostředku řízeného CSemaphore
objektem budou vloženy do systémové fronty a čekat, až vyprší časový limit nebo počet se zvýší nad 0. Maximální počet uživatelů, kteří mají přístup k řízenému prostředku najednou, je zadán během vytváření objektu CSemaphore
.
Chcete-li použít CSemaphore
objekt, vytvořte CSemaphore
objekt v případě potřeby. Zadejte název semaforu, na který chcete čekat, a aplikace by ji měla původně vlastnit. Po návratu konstruktoru pak můžete získat přístup k semaforu. Volání CSyncObject::Unlock po dokončení přístupu k řízenému prostředku.
Alternativní metodou použití CSemaphore
objektů je přidání proměnné typu CSemaphore
jako datového členu do třídy, kterou chcete řídit. Při vytváření řízeného objektu zavolejte konstruktor datového CSemaphore
členu určující počáteční počet přístupu, maximální počet přístupu, název semaphore (pokud se použije přes hranice procesu) a požadované atributy zabezpečení.
Pokud chcete získat přístup k prostředkům řízeným CSemaphore
objekty tímto způsobem, nejprve vytvořte proměnnou typu CSingleLock nebo zadejte CMultiLock ve funkci člena přístupu vašeho prostředku. Potom zavolejte členskou funkci objektu Lock
zámku (například CSingleLock::Lock). V tomto okamžiku vaše vlákno získá přístup k prostředku, počká na uvolnění a získání přístupu, nebo počká na uvolnění a vypršení časového limitu prostředku, který nezíská přístup k prostředku. V každém případě byl váš prostředek přístupný bezpečným způsobem s vlákny. Pokud chcete uvolnit prostředek, použijte členskou Unlock
funkci objektu zámku (například CSingleLock::Unlock) nebo povolte, aby objekt zámku spadal mimo obor.
Alternativně můžete vytvořit CSemaphore
samostatný objekt a získat k němu přístup explicitně předtím, než se pokusíte získat přístup k řízenému prostředku. Tato metoda, zatímco jasnější pro někoho, kdo čte váš zdrojový kód, je náchylnější k chybě.
Další informace o tom, jak používat CSemaphore
objekty, naleznete v článku Multithreading: Jak používat synchronizační třídy.
Hierarchie dědičnosti
CSemaphore
Požadavky
Hlavička: afxmt.h
CSemaphore::CSemaphore
Vytvoří pojmenovaný nebo nepojmenovaný CSemaphore
objekt.
CSemaphore(
LONG lInitialCount = 1,
LONG lMaxCount = 1,
LPCTSTR pstrName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttributes = NULL);
Parametry
lInitialCount
Počáteční počet využití pro semafor. Musí být větší než nebo rovno 0 a menší než nebo rovno lMaxCount.
lMaxCount
Maximální počet využití pro semaphore. Musí být větší než 0.
pstrName
Název semaforu. Je nutné zadat, pokud se k semaforu bude přistupovat přes hranice procesu. Pokud NULL
, objekt bude bez názvu. Pokud název odpovídá existujícímu semaphore, konstruktor vytvoří nový CSemaphore
objekt, který odkazuje na semafor tohoto názvu. Pokud název odpovídá existujícímu synchronizačnímu objektu, který není semaforem, konstrukce selže.
lpsaAttributes
Atributy zabezpečení pro objekt semaphore. Úplný popis této struktury najdete v tématu SECURITY_ATTRIBUTES v sadě Windows SDK.
Poznámky
Pokud chcete získat přístup k objektu nebo ho CSemaphore
uvolnit, vytvořte objekt CMultiLock nebo CSingleLock a zavolejte jeho členské funkce Lock a Unlock .
Důležité
Po vytvoření objektu CSemaphore
použijte GetLastError k zajištění, že mutex ještě neexistuje. Pokud mutex existoval neočekávaně, může to znamenat, že neautorský proces je squatting a může být v úmyslu používat mutex se zlými úmysly. V takovém případě je doporučeným postupem při vědomí zabezpečení zavřít popisovač a pokračovat, jako by při vytváření objektu došlo k chybě.