Kritikus szakaszobjektumok használata

Az alábbi példa bemutatja, hogyan inicializál, belép és elenged egy szál egy kritikus szakaszt. Az InitializeCriticalSectionAndSpinCount, EnterCriticalSection, LeaveCriticalSectionés DeleteCriticalSection függvényt használja.

Warning

Holtpont kockázata: Ha egy szálnak több kritikus szakaszt kell beszereznie, mindig konzisztens, dokumentált sorrendben szerezze be őket az összes szálon. A holtpontok leggyakoribb oka a zárolások különböző sorrendben történő megszerzése különböző szálak által. Vegye azt is figyelembe, hogy a(z) EnterCriticalSection korlátlan ideig blokkol — nem blokkoló zárolásszerzési kísérletekhez használja a TryEnterCriticalSection függvényt, és ha időzített zárolásszerzésre van szüksége, valósítson meg egy megadott időkorláttal rendelkező, korlátozott újrapróbálkozási ciklust.

Note

Modern C++ alternatíva: Új kód esetén fontolja meg a (C++17) használatát std::mutexstd::lock_guardstd::scoped_lock , amely RAII-alapú zároláskezelést biztosít, amely a kivételek esetén is biztosítja a kiadást. Olvasásintenzív munkaterhelések esetén fontolja meg a Slim Reader/Writer (SRW) zárolást vagy a std::shared_mutex használatát.

// 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;
}