Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In het volgende voorbeeld ziet u hoe een thread wordt geïnitialiseerd, een kritieke sectiebetreedt en vrijgeeft. Het maakt gebruik van de InitializeCriticalSectionAndSpinCount, EnterCriticalSection, LeaveCriticalSectionen DeleteCriticalSection functies.
Warning
Impasserisico: Als een thread meerdere kritieke secties moet verkrijgen, moet u deze altijd in een consistente, gedocumenteerde volgorde voor alle threads verkrijgen. Het verkrijgen van vergrendelingen in een verschillende volgorde door verschillende threads is de meest voorkomende oorzaak van deadlocks. Houd er ook rekening mee dat EnterCriticalSection-blokken voor onbepaalde tijd worden geblokkeerd: gebruik TryEnterCriticalSection voor niet-blokkerende overnamepogingen en implementeer een gebonden lus voor opnieuw proberen met een deadline als u timed lock-overname nodig hebt.
Note
Modern C++ alternatief: Voor nieuwe code kunt u overwegen met std::mutex of std::lock_guard (C++17) te gebruikenstd::scoped_lock, die RAII-vergrendelingsbeheer bieden dat zorgt voor release, zelfs wanneer er uitzonderingen worden gegenereerd. Houd voor leesintensieve werkbelastingen rekening met SW-vergrendelingen (Slim Reader/Writer) of 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;
}