CCriticalSection
-Klasse
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
CCriticalSection
Objekts erstellen Sie dasCCriticalSection
Objekt 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
CSingleLock
Klasse. Sie verfügt auch über eineLock
Und-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
dwTimeout
Lock
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
.