Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I följande exempel visas hur en tråd initierar, anger och släpper ett kritiskt avsnitt. Den använder funktionerna InitializeCriticalSectionAndSpinCount, EnterCriticalSection, LeaveCriticalSection och DeleteCriticalSection .
Varning
Dödlägesrisk: Om en tråd måste hämta flera viktiga avsnitt hämtar du dem alltid i en konsekvent, dokumenterad ordning i alla trådar. Att hämta lås i olika ordningar från olika trådar är den vanligaste orsaken till dödlägen. Observera också att EnterCriticalSection blockerar på obestämd tid – använd TryEnterCriticalSection för icke-blockerande förvärvsförsök och implementera en begränsad återförsöksloop med en tidsgräns om du behöver tidsbegränsat låsförvärv.
Note
ModernT C++-alternativ: För ny kod bör du överväga att använda std::mutex med std::lock_guard eller std::scoped_lock (C++17), som tillhandahåller RAII-baserad låshantering som säkerställer frisättning även när undantag utlöses. För läsintensiva arbetsbelastningar bör du överväga SRW-lås (Slim Reader/Writer) eller std::shared_mutex.
// 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;
}