Freigeben über


CMultiLock-Klasse

Stellt den Mechanismus zur Zugriffssteuerung dar, mit dessen Hilfe der Zugriff auf Ressourcen in einem Multithreadprogramm gesteuert wird.

Syntax

class CMultiLock

Member

Öffentliche Konstruktoren

Name Beschreibung
CMultiLock::CMultiLock Erstellt ein CMultiLock-Objekt.

Öffentliche Methoden

Name Beschreibung
CMultiLock::IsLocked Bestimmt, ob ein bestimmtes Synchronisierungsobjekt im Array gesperrt ist.
CMultiLock::Lock Wartet auf das Array von Synchronisierungsobjekten.
CMultiLock::Unlock Gibt alle eigenen Synchronisierungsobjekte frei.

Hinweise

CMultiLock besitzt keine Basisklasse.

Um die Synchronisierungsklassen CSemaphor, CMutex und CEvent zu verwenden, können Sie entweder ein Objekt oder ein CMultiLock CSingleLock-Objekt erstellen, um auf das Synchronisierungsobjekt zu warten und loszulassen. Verwenden Sie diese Verwendung CMultiLock , wenn mehrere Objekte vorhanden sind, die Sie zu einem bestimmten Zeitpunkt verwenden können. Wird verwendet CSingleLock , wenn Sie nur jeweils auf ein Objekt warten müssen.

Um ein CMultiLock Objekt zu verwenden, erstellen Sie zuerst ein Array der Synchronisierungsobjekte, auf die Sie warten möchten. Rufen Sie als Nächstes den Konstruktor des CMultiLock Objekts innerhalb einer Memberfunktion in der Klasse der kontrollierten Ressource auf. Rufen Sie dann die Lock-Memberfunktion auf, um festzustellen, ob eine Ressource verfügbar ist (signalisiert). Wenn dies der Grund ist, fahren Sie mit der Re Standard der der Memberfunktion fort. Wenn keine Ressource verfügbar ist, warten Sie entweder auf einen bestimmten Zeitraum, bis eine Ressource freigegeben wird, oder geben Sie einen Fehler zurück. Nachdem die Verwendung einer Ressource abgeschlossen ist, rufen Sie entweder die Entsperrungsfunktion auf, wenn das CMultiLock Objekt erneut verwendet werden soll, oder lassen Sie es zu, dass das CMultiLock Objekt zerstört wird.

CMultiLock Objekte sind am nützlichsten, wenn ein Thread über eine große Anzahl von CEvent Objekten verfügt, auf die er reagieren kann. Erstellen Sie ein Array, das CEvent alle Zeiger enthält, und rufen Sie auf Lock. Dies führt dazu, dass der Thread wartet, bis eines der Ereignisse signalisiert wird.

Weitere Informationen zur Verwendung von CMultiLock Objekten finden Sie im Artikel Multithreading: Verwenden der Synchronisierungsklassen.

Vererbungshierarchie

CMultiLock

Anforderungen

Kopfzeile: afxmt.h

CMultiLock::CMultiLock

Erstellt ein CMultiLock-Objekt.

CMultiLock(
    CSyncObject* ppObjects [ ],
    DWORD dwCount,
    BOOL bInitialLock = FALSE);

Parameter

ppObjects
Array von Zeigern auf die Synchronisierungsobjekte, auf die gewartet werden soll. Lässt keine NULL-Werte zu.

dwCount
Anzahl der Objekte in ppObjects. Muss größer als 0 sein.

bInitialLock
Gibt an, ob zunächst versucht werden soll, auf eines der bereitgestellten Objekte zuzugreifen.

Hinweise

Diese Funktion wird aufgerufen, nachdem das Array von Synchronisierungsobjekten erstellt wurde, auf das gewartet werden soll. Er wird in der Regel innerhalb des Threads aufgerufen, der warten muss, bis eines der Synchronisierungsobjekte verfügbar ist.

CMultiLock::IsLocked

Bestimmt, ob das angegebene Objekt nicht signalisiert ist (nicht verfügbar).

BOOL IsLocked(DWORD dwItem);

Parameter

dwItem
Der Index im Array von Objekten, die dem Objekt entsprechen, dessen Zustand abgefragt wird.

Rückgabewert

Nonzero, wenn das angegebene Objekt gesperrt ist; andernfalls 0.

CMultiLock::Lock

Rufen Sie diese Funktion auf, um Zugriff auf eine oder mehrere der Ressourcen zu erhalten, die von den Synchronisierungsobjekten gesteuert werden, die dem CMultiLock Konstruktor bereitgestellt werden.

DWORD Lock(
    DWORD dwTimeOut = INFINITE,
    BOOL bWaitForAll = TRUE,
    DWORD dwWakeMask = 0);

Parameter

dwTimeOut
Gibt die Zeit an, die gewartet werden soll, bis das Synchronisierungsobjekt verfügbar ist (signalisiert). Wenn INFINITE, wartet, Lock bis das Objekt vor dem Zurückgeben signalisiert wird.

bWaitForAll
Gibt an, ob alle objekte, auf die gewartet wurde, gleichzeitig signalisiert werden müssen, bevor sie zurückgegeben werden. Wenn FALSE, wird zurückgegeben, Lock wenn eines der Objekte, auf die gewartet wurde, signalisiert wird.

dwWakeMask
Gibt weitere Bedingungen an, die die Wartezeit abbrechen dürfen. Eine vollständige Liste der verfügbaren Optionen für diesen Parameter finden Sie unter MsgWaitForMultipleObjects im Windows SDK.

Rückgabewert

Wenn Lock ein Fehler auftritt, wird - 1 zurückgegeben. Bei erfolgreicher Ausführung gibt sie einen der folgenden Werte zurück:

  • Zwischen WAIT_OBJECT_0 und WAIT_OBJECT_0 + (Anzahl der Objekte - 1)

    Wenn bWaitForAll TRUE ist, werden alle Objekte signalisiert (verfügbar). Wenn bWaitForAll FALSE ist, ist der Rückgabewert - WAIT_OBJECT_0 der Index im Array der Objekte des Objekts, das signalisiert (verfügbar) ist.

  • WAIT_OBJECT_0 + (Anzahl der Objekte)

    Ein in dwWakeMask angegebenes Ereignis ist in der Eingabewarteschlange des Threads verfügbar.

  • Zwischen WAIT_ABANDONED_0 und WAIT_ABANDONED_0 + (Anzahl der Objekte - 1)

    Wenn bWaitForAll TRUE ist, werden alle Objekte signalisiert, und mindestens eines der Objekte ist ein verlassenes Mutex-Objekt. Wenn bWaitForAll FALSE ist, ist der Rückgabewert - WAIT_ABANDONED_0 der Index im Array von Objekten des verlassenen Mutex-Objekts, das die Wartezeit erfüllt hat.

  • WAIT_TIMEOUT

    Das in dwTimeOut angegebene Timeoutintervall ist abgelaufen, ohne dass die Wartezeit erfolgreich war.

Hinweise

Wenn bWaitForAll TRUE ist, wird erfolgreich zurückgegeben, Lock sobald alle Synchronisierungsobjekte gleichzeitig signalisiert werden. Wenn bWaitForAll FALSCH ist, wird zurückgegeben, Lock sobald mindestens ein Synchronisierungsobjekt signalisiert wird.

Wenn Lock die Rückgabe nicht sofort möglich ist, wartet sie vor der Rückgabe nicht mehr als die Anzahl der im dwTimeOut-Parameter angegebenen Millisekunden. Wenn dwTimeOut INFINITE ist, wird erst zurückgegeben, Lock wenn der Zugriff auf ein Objekt gewonnen wird oder eine in dwWakeMask angegebene Bedingung erfüllt wurde. Lock Andernfalls wird ein Synchronisierungsobjekt erfolgreich zurückgegeben, andernfalls wird ein Fehler zurückgegeben.

CMultiLock::Unlock

Gibt das Synchronisierungsobjekt im Besitz von CMultiLock.

BOOL Unlock();

BOOL Unlock(
    LONG lCount,
    LPLONG lPrevCount = NULL);

Parameter

lCount
Anzahl der zu veröffentlichenden Referenzanzahlen. Muss größer als 0 sein. Wenn der angegebene Betrag dazu führen würde, dass die Anzahl des Objekts das Maximum überschreitet, wird die Anzahl nicht geändert, und die Funktion gibt FALSE zurück.

lPrevCount
Verweist auf eine Variable, um die vorherige Anzahl des Synchronisierungsobjekts zu erhalten. Wenn NULL, wird die vorherige Anzahl nicht zurückgegeben.

Rückgabewert

Nonzero, wenn die Funktion erfolgreich war; andernfalls 0.

Hinweise

Diese Funktion wird von CMultiLock's Destruktor' aufgerufen.

Die erste Form von Unlock Versuchen, das durch CMultiLockverwaltete Synchronisierungsobjekt zu entsperren. Die zweite Form von Unlock Versuchen, die Objekte zu entsperren, die CSemaphore im Besitz sind CMultiLock. Wenn CMultiLock kein gesperrtes CSemaphore Objekt vorhanden ist, gibt die Funktion FALSE zurück. Andernfalls wird WAHR zurückgegeben. lCount und lpPrevCount sind genau identisch mit den Parametern von CSingleLock::Unlock. Die zweite Form von Unlock ist selten auf Multilocksituationen anwendbar.

Siehe auch

Hierarchiediagramm