Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Stellt einen "kritischen Abschnitt" dar – ein Synchronisierungsobjekt, mit dem jeweils ein Thread auf eine Ressource oder einen Codeabschnitt zugreifen kann.
Syntax
class CCriticalSection : public CSyncObject
Member
Öffentliche Konstruktoren
| Name | Beschreibung |
|---|---|
CCriticalSection::CCriticalSection |
Erstellt ein CCriticalSection-Objekt. |
Öffentliche Methoden
| Name | Beschreibung |
|---|---|
CCriticalSection::Lock |
Wird verwendet, um Zugriff auf das CCriticalSection Objekt zu erhalten. |
CCriticalSection::Unlock |
Gibt das CCriticalSection-Objekt frei. |
Öffentliche Operatoren
| Name | Beschreibung |
|---|---|
CCriticalSection::operator CRITICAL_SECTION* |
Ruft einen Zeiger auf das interne CRITICAL_SECTION Objekt ab. |
Öffentliche Datenmember
| Name | Beschreibung |
|---|---|
CCriticalSection::m_sect |
Ein CRITICAL_SECTION-Objekt. |
Hinweise
Kritische Abschnitte sind nützlich, wenn jeweils nur ein Thread Daten oder eine andere kontrollierte Ressource ändern kann. Beispielsweise ist das Hinzufügen von Knoten zu einer verknüpften Liste ein Prozess, der nur jeweils von einem Thread zulässig sein sollte. Durch Die Verwendung eines CCriticalSection Objekts zum Steuern der verknüpften Liste kann jeweils nur ein Thread Zugriff auf die Liste erhalten.
Hinweis
Die Funktionalität der CCriticalSection Klasse wird von einem tatsächlichen Win32-Objekt CRITICAL_SECTION bereitgestellt.
Kritische Abschnitte werden anstelle von Mutexen verwendet (siehe CMutex), wenn geschwindigkeitskritisch ist und die Ressource nicht über Prozessgrenzen hinweg verwendet wird.
Es gibt zwei Methoden für die Verwendung eines CCriticalSection Objekts: stand-alone und eingebettet in eine Klasse.
Eigenständige Methode Zum Verwenden eines eigenständigen
CCriticalSectionObjekts erstellen Sie dasCCriticalSectionObjekt bei Bedarf. Nach einer erfolgreichen Rückgabe vom Konstruktor sperren Sie das Objekt explizit mit einem Aufruf vonLock. Rufen Sie aufUnlock, wenn Sie mit dem Zugriff auf den kritischen Abschnitt fertig sind. Diese Methode ist zwar für jemanden, der Ihren Quellcode liest, anfälliger für Fehler, da Sie sich daran erinnern müssen, den kritischen Abschnitt vor und nach dem Zugriff zu sperren und zu entsperren.Eine bevorzugtere Methode ist die Verwendung der
CSingleLockKlasse. Sie verfügt auch über eineLockUnd-MethodeUnlock, aber Sie müssen sich keine Gedanken über das Entsperren der Ressource machen, wenn eine Ausnahme auftritt.Eingebettete Methode Sie können eine Klasse auch für mehrere Threads freigeben, indem Sie der Klasse ein
CCriticalSection"-type"-Datenelement hinzufügen und das Datenelement bei Bedarf sperren.
Weitere Informationen zur Verwendung von CCriticalSection Objekten finden Sie im Artikel Multithreading: Verwenden der Synchronisierungsklassen.
Vererbungshierarchie
CCriticalSection
Anforderungen
Header: afxmt.h
CCriticalSection::CCriticalSection
Erstellt ein CCriticalSection-Objekt.
CCriticalSection();
Hinweise
Um auf ein CCriticalSection Objekt zuzugreifen oder freizugeben, erstellen Sie ein CSingleLock Objekt, und rufen Sie die zugehörigen Lock und Unlock Memberfunktionen auf. Wenn das CCriticalSection Objekt eigenständig verwendet wird, rufen Sie dessen Unlock Memberfunktion auf, um es freizugeben.
Wenn der Konstruktor den erforderlichen Systemspeicher nicht zuweist, wird automatisch eine Speicher ausnahme (vom Typ CMemoryException) ausgelöst.
Beispiel
Sehen Sie sich das Beispiel für CCriticalSection::Lock an.
CCriticalSection::Lock
Rufen Sie diese Memberfunktion auf, um Zugriff auf das kritische Abschnittsobjekt zu erhalten.
BOOL Lock();
BOOL Lock(DWORD dwTimeout);
Parameter
dwTimeoutLock ignoriert diesen Parameterwert.
Rückgabewert
Nonzero, wenn die Funktion erfolgreich war; andernfalls 0.
Hinweise
Lock ist ein blockierender Aufruf, der erst zurückgegeben wird, wenn das kritische Abschnittsobjekt signalisiert wird (wird verfügbar).
Wenn zeitlimitierte Wartezeiten erforderlich sind, können Sie anstelle eines CCriticalSection Objekts ein CMutex Objekt verwenden.
Wenn Lock der erforderliche Systemspeicher nicht zugeordnet werden kann, wird automatisch eine Speicher ausnahme (vom Typ CMemoryException) ausgelöst.
Beispiel
In diesem Beispiel wird der geschachtelte kritische Abschnittsansatz veranschaulicht, indem der Zugriff auf eine freigegebene Ressource (das statische _strShared Objekt) mithilfe eines freigegebenen CCriticalSection Objekts gesteuert wird. Die SomeMethod Funktion veranschaulicht das Aktualisieren einer freigegebenen Ressource auf sichere Weise.
//Definition of critical section class
class CMyCritSectClass
{
static CString _strShared; //shared resource
static CCriticalSection _critSect;
public:
CMyCritSectClass(void) {}
~CMyCritSectClass(void) {}
void SomeMethod(void); //locks, modifies, and unlocks shared resource
};
//Declaration of static members and SomeMethod
CString CMyCritSectClass::_strShared;
CCriticalSection CMyCritSectClass::_critSect;
void CMyCritSectClass::SomeMethod()
{
_critSect.Lock();
if (_strShared == "")
_strShared = "<text>";
_critSect.Unlock();
}
CCriticalSection::m_sect
Enthält ein kritisches Abschnittsobjekt, das von allen CCriticalSection Methoden verwendet wird.
CRITICAL_SECTION m_sect;
CCriticalSection::operator CRITICAL_SECTION*
Ruft ein CRITICAL_SECTION Objekt ab.
operator CRITICAL_SECTION*();
Hinweise
Rufen Sie diese Funktion auf, um einen Zeiger auf das interne CRITICAL_SECTION Objekt abzurufen.
CCriticalSection::Unlock
Gibt das Objekt für die CCriticalSection Verwendung durch einen anderen Thread frei.
BOOL Unlock();
Rückgabewert
Nonzero, wenn das CCriticalSection Objekt im Besitz des Threads war und die Freigabe erfolgreich war; andernfalls 0.
Hinweise
Wenn die CCriticalSection Verwendung eigenständig erfolgt, muss unmittelbar nach Abschluss der Nutzung der ressource aufgerufen werden, Unlock die vom kritischen Abschnitt gesteuert wird. Wenn ein CSingleLock Objekt verwendet wird, CCriticalSection::Unlock wird die Memberfunktion des Sperrobjekts Unlock aufgerufen.
Beispiel
Ein Beispiel hierfür finden Sie unter CCriticalSection::Lock.