InitializeCriticalSectionAndSpinCount-Funktion (synchapi.h)
Initialisiert ein kritisches Abschnittsobjekt und legt die Anzahl der Drehvorgänge für den kritischen Abschnitt fest. Wenn ein Thread versucht, einen kritischen Abschnitt abzurufen, der gesperrt ist, dreht sich der Thread: Er tritt in eine Schleife ein, die die Anzahl der Drehvorgänge durchläuft, und überprüft, ob die Sperre freigegeben wird. Wenn die Sperre nicht vor Abschluss der Schleife freigegeben wird, wechselt der Thread in den Ruhemodus, um auf die Freigabe der Sperre zu warten.
Syntax
BOOL InitializeCriticalSectionAndSpinCount(
[out] LPCRITICAL_SECTION lpCriticalSection,
[in] DWORD dwSpinCount
);
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.
Rückgabewert
Diese Funktion ist immer erfolgreich und gibt einen nichtzero-Wert zurück.
Windows Server 2003 und Windows XP: Wenn die Funktion erfolgreich ist, ist der Rückgabewert nonzero. Wenn die Funktion fehlschlägt, ist der Rückgabewert 0 0
. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf. Ab Windows Vista ist die InitializeCriticalSectionAndSpinCount-Funktion auch in Situationen mit wenig Arbeitsspeicher immer erfolgreich.
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. Das System ist jedoch 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 beispielsweise eine Drehzahl von etwa 4.000 für die kritischen Abschnitte pro Heap.
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.
Beispiele
Ein Beispiel, das InitializeCriticalSectionAndSpinCount verwendet, finden Sie unter Using Critical Section Objects.
Anforderungen
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 (einschließlich Windows.h unter Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
Bibliothek | Kernel32.lib |
DLL | Kernel32.dll |