CMultiLock – třída
Představuje mechanismus řízení přístupu používaný při řízení přístupu k prostředkům v multithreaded programu.
Syntaxe
class CMultiLock
Členové
Veřejné konstruktory
Název | Popis |
---|---|
CMultiLock::CMultiLock | CMultiLock Vytvoří objekt. |
Veřejné metody
Název | Popis |
---|---|
CMultiLock::IsLocked | Určuje, zda je určitý synchronizační objekt v poli uzamčen. |
CMultiLock::Lock | Čeká na pole synchronizačních objektů. |
CMultiLock::Unlock | Uvolní všechny objekty synchronizace ve vlastnictví. |
Poznámky
CMultiLock
nemá základní třídu.
Chcete-li použít synchronizační třídy CSemaphore, CMutex a CEvent, můžete vytvořit CMultiLock
objekt CSingleLock, který bude čekat a uvolnit synchronizační objekt. Použijte CMultiLock
, když existuje více objektů, které můžete použít v určitém okamžiku. Použijte CSingleLock
, když potřebujete čekat jenom na jeden objekt najednou.
Pokud chcete použít CMultiLock
objekt, nejprve vytvořte pole synchronizačních objektů, na které chcete čekat. Dále zavolejte konstruktor objektu CMultiLock
uvnitř členské funkce ve třídě řízeného prostředku. Potom volejte členovou funkci Lock a určete, jestli je prostředek k dispozici (signalován). Pokud ano, pokračujte zbývající částí členské funkce. Pokud není k dispozici žádný prostředek, počkejte buď na určité množství času, než se prostředek uvolní, nebo se vrátí chyba. Po dokončení použití prostředku buď zavolejte funkci Unlock , pokud CMultiLock
se má objekt znovu použít, nebo povolte zničení objektu CMultiLock
.
CMultiLock
objekty jsou nejužitečnější, když vlákno obsahuje velký počet CEvent
objektů, na které může reagovat. Vytvořte pole obsahující všechny CEvent
ukazatele a volejte Lock
. To způsobí, že vlákno počká, dokud nebude signalizovat jednu z událostí.
Další informace o tom, jak používat CMultiLock
objekty, naleznete v článku Multithreading: Jak používat synchronizační třídy.
Hierarchie dědičnosti
CMultiLock
Požadavky
Hlavička: afxmt.h
CMultiLock::CMultiLock
CMultiLock
Vytvoří objekt.
CMultiLock(
CSyncObject* ppObjects [ ],
DWORD dwCount,
BOOL bInitialLock = FALSE);
Parametry
ppObjects
Pole ukazatelů na synchronizační objekty, na které se mají čekat. Nesmí mít hodnotu NULL.
dwCount
Počet objektů v ppObjects. Musí být větší než 0.
bInitialLock
Určuje, zda se má nejprve pokusit o přístup k některému ze zadaných objektů.
Poznámky
Tato funkce se volá po vytvoření pole synchronizačních objektů, na které se má čekat. Obvykle se volá z vlákna, které musí čekat na zpřístupnění jednoho z synchronizačních objektů.
CMultiLock::IsLocked
Určuje, zda zadaný objekt není znaménka (není k dispozici).
BOOL IsLocked(DWORD dwItem);
Parametry
dwItem
Index v poli objektů odpovídajících objektu, jehož stav je dotazován.
Návratová hodnota
Nenulové, pokud je zadaný objekt uzamčen; jinak 0.
CMultiLock::Lock
Voláním této funkce získáte přístup k jednomu nebo více prostředkům řízeným synchronizačními objekty zadanými do konstruktoru CMultiLock
.
DWORD Lock(
DWORD dwTimeOut = INFINITE,
BOOL bWaitForAll = TRUE,
DWORD dwWakeMask = 0);
Parametry
dwTimeOut
Určuje dobu čekání na dostupnost objektu synchronizace (signalováno). Pokud je NEKONEČNO, bude čekat, Lock
až se objekt před návratem signalizují.
bWaitForAll
Určuje, zda se všechny objekty, na které čekaly, musí před vrácením signalizovat současně. Pokud je hodnota FALSE, Lock
vrátí se, když se signalizují některé z objektů, na které čekalo.
dwWakeMask
Určuje další podmínky, které mají povoleno přerušit čekání. Úplný seznam dostupných možností pro tento parametr naleznete v tématu MsgWaitForMultipleObjects v sadě Windows SDK.
Návratová hodnota
Pokud Lock
selže, vrátí hodnotu - 1. V případě úspěchu vrátí jednu z následujících hodnot:
Mezi WAIT_OBJECT_0 a WAIT_OBJECT_0 + (počet objektů - 1)
Pokud bWaitForAll je TRUE, všechny objekty jsou signalovány (k dispozici). Pokud bWaitForAll je FALSE, návratová hodnota - WAIT_OBJECT_0 je index v poli objektů objektu, který je signalován (k dispozici).
WAIT_OBJECT_0 + (počet objektů)
Událost zadaná v dwWakeMask je k dispozici ve vstupní frontě vlákna.
Mezi WAIT_ABANDONED_0 a WAIT_ABANDONED_0 + (počet objektů - 1)
Pokud bWaitForAll je TRUE, všechny objekty jsou signalovány a alespoň jeden z objektů je opuštěný objekt mutex. Pokud bWaitForAll je FALSE, návratová hodnota - WAIT_ABANDONED_0 je index v poli objektů opuštěného mutex objektu, který splnil čekání.
WAIT_TIMEOUT
Časový limit zadaný v dwTimeOut vypršel bez úspěšného čekání.
Poznámky
Pokud bWaitForAll je TRUE, vrátí se úspěšně, Lock
jakmile se všechny synchronizační objekty budou signalizovat současně. Pokud bWaitForAll je FALSE, Lock
vrátí se jakmile jeden nebo více synchronizačních objektů se signalizují.
Pokud Lock
se nedá vrátit okamžitě, před vrácením počká na maximálně počet milisekund zadaných v parametru dwTimeOut . Pokud je dwTimeOut NEKONEČNO, nevrátí se, Lock
dokud se nezíská přístup k objektu nebo nebyla splněna podmínka zadaná v dwWakeMask . V opačném případě, pokud Lock
byl schopen získat synchronizační objekt, vrátí se úspěšně. Pokud ne, vrátí se chyba.
CMultiLock::Unlock
Uvolní synchronizační objekt vlastněný CMultiLock
.
BOOL Unlock();
BOOL Unlock(
LONG lCount,
LPLONG lPrevCount = NULL);
Parametry
LCount
Počet referenčních počtů k vydání. Musí být větší než 0. Pokud zadané množství způsobí, že počet objektu překročí jeho maximum, počet se nezmění a funkce vrátí hodnotu FALSE.
lPrevCount
Odkazuje na proměnnou pro příjem předchozího počtu objektu synchronizace. Pokud hodnota NULL, předchozí počet se nevrátí.
Návratová hodnota
Nenulové, pokud byla funkce úspěšná; jinak 0.
Poznámky
Tato funkce je volána destruktorem CMultiLock
.
První forma pokusu Unlock
o odemknutí objektu synchronizace spravovaného .CMultiLock
Druhá forma Unlock
pokusů o odemknutí CSemaphore
objektů vlastněných CMultiLock
. Pokud CMultiLock
žádný uzamčený CSemaphore
objekt nevlastní, vrátí funkce hodnotu NEPRAVDA. V opačném případě vrátí hodnotu PRAVDA. LCount a lpPrevCount jsou přesně stejné jako parametry CSingleLock::Unlock. Druhá forma Unlock
je zřídka použitelná pro situace s více zámky.