Sdílet prostřednictvím


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

Objekt CObject

CSyncObject

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ě.

Viz také

CSyncObject – třída
Graf hierarchie