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 dem Rest 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 CMultiLock
verwaltete 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.