SetCriticalSectionSpinCount-Funktion (synchapi.h)

Legt die Anzahl der Drehvorgänge für den angegebenen kritischen Abschnitt fest. Wenn ein Thread versucht, einen kritischen gesperrten Abschnitt abzurufen, wechselt der Thread in eine Schleife, überprüft, ob die Sperre aufgehoben wird, und wenn die Sperre nicht aufgehoben wird, wechselt der Thread in den Standbymodus.

Syntax

DWORD SetCriticalSectionSpinCount(
  [in, out] LPCRITICAL_SECTION lpCriticalSection,
  [in]      DWORD              dwSpinCount
);

Parameter

[in, out] lpCriticalSection

Ein Zeiger auf das Kritische Abschnittsobjekt.

[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 Abschnittsdrehvorgänge wird auf Null (0) festgelegt. Wenn der kritische Abschnitt auf Multiprozessorsystemen nicht verfügbar ist, dreht der aufrufende Thread dwSpinCount mal, bevor ein Wartevorgang für einen Semaphor ausgeführt wird, der dem kritischen Abschnitt zugeordnet ist. Wenn der kritische Abschnitt während dem Spinvorgang frei wird, vermeidet der aufrufende Thread den Wartevorgang.

Rückgabewert

Die Funktion gibt die vorherige Drehzahl für den kritischen Abschnitt zurück.

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 die Funktion InitializeCriticalSection oder InitializeCriticalSectionAndSpinCount aufrufen, um das Objekt zu initialisieren. Anschließend können Sie die Anzahl der Drehungen ändern, indem Sie die SetCriticalSectionSpinCount-Funktion aufrufen.

Die Anzahl der Drehungen ist nützlich für kritische Abschnitte mit kurzer Dauer, die zu hohen Konflikten führen können. Stellen Sie sich ein Worst-Case-Szenario vor, 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 um den kritischen Abschnitt konstant, und jeder Thread führt einen verarbeitungsintensiven Aufruf der WaitForSingleObject-Funktion aus. Wenn die Anzahl der Drehungen jedoch richtig festgelegt ist, ruft der aufrufende Thread nicht sofort WaitForSingleObject auf, wenn ein Konflikt auftritt. 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 eine Drehzahl von etwa 4000 für seine kritischen Abschnitte pro Heap. Dies bietet in fast allen Worst-Case-Szenarien eine hohe Leistung und Skalierbarkeit.

Um eine Anwendung zu kompilieren, die diese Funktion verwendet, definieren Sie _WIN32_WINNT als 0x0403 oder höher. Weitere Informationen finden Sie unter Verwenden der Windows-Header.

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

Siehe auch

Kritische Abschnittsobjekte

InitializeCriticalSection

InitializeCriticalSectionAndSpinCount

Waitforsingleobject

Synchronisierungsfunktionen

In VBS-Enclaves verfügbare Vertdll-APIs