Teilen über


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 das CCriticalSection Objekt bei Bedarf. Nach einer erfolgreichen Rückgabe vom Konstruktor sperren Sie das Objekt explizit mit einem Aufruf von Lock. Rufen Sie auf Unlock , 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 eine Lock Und-Methode Unlock , 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

CObject

CSyncObject

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.

Siehe auch

CSyncObject Klasse
Hierarchiediagramm
CMutex Klasse