EnterCriticalSection-Funktion (synchapi.h)
Wartet auf den Besitz des angegebenen kritischen Abschnittsobjekts. Die Funktion gibt zurück, wenn dem aufrufenden Thread der Besitz gewährt wird.
Syntax
void EnterCriticalSection(
[in, out] LPCRITICAL_SECTION lpCriticalSection
);
Parameter
[in, out] lpCriticalSection
Ein Zeiger auf das Kritische Abschnittsobjekt.
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Diese Funktion kann EXCEPTION_POSSIBLE_DEADLOCK auslösen, die auch als STATUS_POSSIBLE_DEADLOCK bezeichnet wird, wenn bei einem Wartevorgang für den kritischen Abschnitt ein Zeitüberschreitung auftritt. Das Timeoutintervall wird durch den folgenden Registrierungswert angegeben: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CriticalSectionTimeout. Behandeln Sie keine mögliche Deadlock-Ausnahme. Debuggen Sie stattdessen die Anwendung.
Hinweise
Die Threads eines einzelnen Prozesses können ein kritisches Abschnittsobjekt für die Synchronisierung mit gegenseitigem Ausschluss verwenden. Der Prozess ist für die Zuweisung des von einem kritischen Abschnittsobjekt verwendeten Arbeitsspeichers verantwortlich. Dies kann durch Deklarieren einer Variablen vom Typ CRITICAL_SECTION. Vor der Verwendung eines kritischen Abschnitts muss ein Thread des Prozesses InitializeCriticalSection oder InitializeCriticalSectionAndSpinCount aufrufen, um das Objekt zu initialisieren.
Um den gegenseitig ausschließenden Zugriff auf eine freigegebene Ressource zu ermöglichen, ruft jeder Thread die Funktion EnterCriticalSection oder TryEnterCriticalSection auf, um den Besitz des kritischen Abschnitts anzufordern, bevor ein Codeabschnitt ausgeführt wird, der auf die geschützte Ressource zugreift. Der Unterschied besteht darin, dass TryEnterCriticalSection sofort zurückgibt, unabhängig davon, ob es den Besitz des kritischen Abschnitts erhalten hat, während EnterCriticalSection blockiert, bis der Thread den Besitz des kritischen Abschnitts übernehmen kann. Wenn die Ausführung des geschützten Codes abgeschlossen ist, verwendet der Thread die LeaveCriticalSection-Funktion , um den Besitz aufzugeben, sodass ein anderer Thread Besitzer wird und auf die geschützte Ressource zugreifen kann. Es gibt keine Garantie für die Reihenfolge, in der wartende Threads den Besitz des kritischen Abschnitts erwerben.
Nachdem ein Thread über den Besitz eines kritischen Abschnitts verfügt, kann er zusätzliche Aufrufe von EnterCriticalSection oder TryEnterCriticalSection ausführen, ohne dessen Ausführung zu blockieren. Dadurch wird verhindert, dass ein Thread selbst deadlockt, während er auf einen kritischen Abschnitt wartet, den er bereits besitzt. Der Thread wechselt jedes Mal in den kritischen Abschnitt, wenn EnterCriticalSection und TryEnterCriticalSection erfolgreich sind. Ein Thread muss LeaveCriticalSection einmal aufrufen, wenn er in den kritischen Abschnitt gelangt ist.
Jeder Thread des Prozesses kann die DeleteCriticalSection-Funktion verwenden, um die Systemressourcen freizugeben, die bei der Initialisierung des kritischen Abschnittsobjekts zugeordnet wurden. Nachdem diese Funktion aufgerufen wurde, kann das kritische Abschnittsobjekt nicht mehr für die Synchronisierung verwendet werden.
Wenn ein Thread beendet wird, während er über den Besitz eines kritischen Abschnitts verfügt, ist der Status des kritischen Abschnitts nicht definiert.
Wenn ein kritischer Abschnitt gelöscht wird, während er sich noch im Besitz befindet, ist der Status der Threads, die auf den Besitz des gelöschten kritischen Abschnitts warten, nicht definiert.
Wenn ein Prozess beendet wird, wird der Prozess stattdessen sofort beendet, wenn ein Aufruf von EnterCriticalSection blockiert würde. Dies kann dazu führen, dass globale Destruktoren nicht aufgerufen werden.
Beispiele
Ein Beispiel, das EnterCriticalSection verwendet, finden Sie unter Verwenden kritischer Abschnittsobjekte.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows XP [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | synchapi.h (enthalten Windows.h unter Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
Bibliothek | Kernel32.lib |
DLL | Kernel32.dll |