Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das folgende Beispiel zeigt, wie ein Thread einen kritischen Abschnitt initialisiert, eingibt und loslässt. Es verwendet die Funktionen InitializeCriticalSectionAndSpinCount, EnterCriticalSection, LeaveCriticalSection und DeleteCriticalSection .
Warnung
Deadlock-Risiko: Wenn ein Thread mehrere kritische Abschnitte abrufen muss, erwerben Sie sie immer in einer konsistenten, dokumentierten Reihenfolge über alle Threads hinweg. Das Erwerben von Sperren in unterschiedlicher Reihenfolge durch verschiedene Threads ist die häufigste Ursache für Deadlocks. Beachten Sie außerdem, dass EnterCriticalSection auf unbestimmte Zeit blockiert – Verwenden Sie TryEnterCriticalSection für nicht blockierende Kaufversuche, und implementieren Sie eine gebundene Wiederholungsschleife mit einem Stichtag, wenn Sie einen zeitgesteuerten Lock-Kauf benötigen.
Note
Moderne C++-Alternative: Für neuen Code sollten Sie die Verwendung von std::mutex mit std::lock_guard oder std::scoped_lock (C++17) in Betracht ziehen, die eine RAII-basierte Sperrenverwaltung bieten und die Freigabe auch dann sicherstellen, wenn Ausnahmen geworfen werden. Ziehen Sie bei leseintensiven Arbeitslasten Slim Reader/Writer (SRW) Locks oder std::shared_mutex in Betracht.
// Global variable
CRITICAL_SECTION CriticalSection;
int main( void )
{
...
// Initialize the critical section one time only.
if (!InitializeCriticalSectionAndSpinCount(&CriticalSection,
0x00000400) )
return;
...
// Release resources used by the critical section object.
DeleteCriticalSection(&CriticalSection);
}
DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
...
// Request ownership of the critical section.
EnterCriticalSection(&CriticalSection);
// Access the shared resource.
// Release ownership of the critical section.
LeaveCriticalSection(&CriticalSection);
...
return 1;
}