Sdílet prostřednictvím


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

Jméno popis
CMultiLock::CMultiLock CMultiLock Vytvoří objekt.

Veřejné metody

Jméno 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.

Vrácená 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.

Vrácená 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í.

Vrácená 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.

Viz také

Graf hierarchie