InitializeCriticalSectionEx-Funktion (synchapi.h)
Initialisiert ein kritisches Abschnittsobjekt mit einer Drehzahl und optionalen Flags.
Syntax
BOOL InitializeCriticalSectionEx(
[out] LPCRITICAL_SECTION lpCriticalSection,
[in] DWORD dwSpinCount,
[in] DWORD Flags
);
Parameter
[out] lpCriticalSection
Ein Zeiger auf das Objekt des kritischen Abschnitts.
[in] dwSpinCount
Die Anzahl der Drehvorgänge für das Objekt des kritischen Abschnitts. Auf Einzelprozessorsystemen wird die Anzahl der Drehvorgänge ignoriert, und die Anzahl der kritischen Abschnitte wird auf 0 (null) festgelegt. Wenn auf Multiprozessorsystemen der kritische Abschnitt nicht verfügbar ist, dreht der aufrufende Thread dwSpinCount mal, bevor er einen Wartevorgang für einen Semaphor ausführt, der dem kritischen Abschnitt zugeordnet ist. Wenn der kritische Abschnitt während dem Spinvorgang frei wird, vermeidet der aufrufende Thread den Wartevorgang.
[in] Flags
Dieser Parameter kann 0 oder der folgende Wert sein.
Wert | Bedeutung |
---|---|
CRITICAL_SECTION_NO_DEBUG_INFO | Der kritische Abschnitt wird ohne Debuginformationen erstellt. |
Rückgabewert
Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich Null.
Wenn die Funktion fehlschlägt, ist der Rückgabewert 0 (null). Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.
Hinweise
Die Threads eines einzelnen Prozesses können ein kritisches Abschnittsobjekt für die Synchronisierung mit gegenseitigem Ausschluss verwenden. Es gibt keine Garantie für die Reihenfolge, in der Threads den Besitz des kritischen Abschnitts erhalten, aber das System ist für alle Threads fair.
Der Prozess ist für die Zuweisung des von einem kritischen Abschnittsobjekt verwendeten Arbeitsspeichers verantwortlich, was durch Deklarieren einer Variablen vom Typ CRITICAL_SECTION möglich ist. Vor der Verwendung eines kritischen Abschnitts muss ein Thread des Prozesses das Objekt initialisieren. Anschließend können Sie die Anzahl der Drehvorgänge ändern, indem Sie die SetCriticalSectionSpinCount-Funktion aufrufen.
Nachdem ein kritisches Abschnittsobjekt initialisiert wurde, können die Threads des Prozesses das -Objekt in der Funktion EnterCriticalSection, TryEnterCriticalSection oder LeaveCriticalSection angeben, um gegenseitig ausschließenden Zugriff auf eine freigegebene Ressource bereitzustellen. Verwenden Sie für eine ähnliche Synchronisierung zwischen den Threads verschiedener Prozesse ein Mutex-Objekt.
Ein kritisches Abschnittsobjekt kann nicht verschoben oder kopiert werden. Der Prozess darf das Objekt auch nicht ändern, sondern muss es als logisch undurchsichtig behandeln. Verwenden Sie nur die kritischen Abschnittsfunktionen, um kritische Abschnittsobjekte zu verwalten. Wenn Sie den kritischen Abschnitt abgeschlossen haben, rufen Sie die DeleteCriticalSection-Funktion auf.
Ein kritisches Abschnittsobjekt muss gelöscht werden, bevor es neu initialisiert werden kann. Das Initialisieren eines kritischen Abschnitts, der bereits initialisiert ist, führt zu einem nicht definierten Verhalten.
Die Anzahl der Drehungen ist nützlich für kritische Abschnitte mit kurzer Dauer, die zu hohen Konflikten führen können. Betrachten Sie ein Worst-Case-Szenario, in dem eine Anwendung auf einem SMP-System über zwei oder drei Threads verfügt, die ständig Arbeitsspeicher aus dem Heap zuweisen und freigeben. Die Anwendung serialisiert den Heap mit einem kritischen Abschnitt. Im schlimmsten Fall ist der Konflikt für den kritischen Abschnitt konstant, und jeder Thread führt einen verarbeitungsintensiven Aufruf der WaitForSingleObject-Funktion durch. Wenn die Anzahl der Spins jedoch ordnungsgemäß festgelegt ist, ruft der aufrufende Thread WaitForSingleObject nicht sofort auf, wenn Konflikte auftreten. Stattdessen kann der aufrufende Thread den Besitz des kritischen Abschnitts erwerben, wenn er während des Spinvorgangs freigegeben wird.
Sie können die Leistung erheblich verbessern, indem Sie eine kleine Drehzahl für einen kritischen Abschnitt mit kurzer Dauer auswählen. Der Heap-Manager verwendet für die kritischen Abschnitte pro Heap eine Spinanzahl von etwa 4.000. Dies bietet eine hervorragende Leistung und Skalierbarkeit in fast allen Worst-Case-Szenarien.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows Vista [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2008 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | synchapi.h (Einschließen von Windows.h unter Windows 7, Windows Server 2008 Windows Server 2008 R2) |
Bibliothek | Kernel32.lib |
DLL | Kernel32.dll |