Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Objekt třídy CSemaphore představuje "semaphore". Semaphore je synchronizační objekt, který řídí přístup ke sdíleným prostředkům a zabraňuje podmínkám časování.
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 jiných uživatelů. Když počet dosáhne nuly, všechny pokusy o použití prostředku řízeného CSemaphore objektem se vloží do systémové fronty a počká, až vyprší jejich časový limit, nebo se počet 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žívá 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ě se k vašemu prostředku přistupuje bezpečným způsobem z více vláken. 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. Musí být zadána, pokud se k semaforu přistupuje 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 objektu synchronizace, 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 CMultiLock objekt nebo CSingleLock objekt a Lock jeho členské funkce a odemkněte je.
Důležité
Po vytvoření objektu CSemaphore se ujistěte GetLastError , že objekt 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é
třídy
Graf hierarchie