Použití objektů kritické sekce

Následující příklad ukazuje, jak vlákno inicializuje, vstoupí do a uvolní kritickou sekci. Používá InitializeCriticalSectionAndSpinCount, EnterCriticalSection, LeaveCriticalSectiona DeleteCriticalSection.

Warning

Riziko zablokování: Pokud vlákno musí vstoupit do více kritických sekcí, vždy do nich vstupujte v konzistentním, zdokumentovaném pořadí ve všech vláknech. Získávání zámků v různém pořadí v různých vláknech je nejčastější příčinou uváznutí. Všimněte si také, že EnterCriticalSection blokuje na neomezenou dobu — pro neblokující pokusy o získání zámku použijte TryEnterCriticalSection a pokud potřebujete získat zámek s časovým limitem, implementujte omezenou opakovací smyčku s časovým limitem.

Note

Moderní alternativa jazyka C++: U nového kódu zvažte použití s std::mutexstd::lock_guard nebo std::scoped_lock (C++17), které poskytují správu zámků založené na RAII, která zajišťuje uvolnění i v případě, že dojde k vyvolání výjimek. U úloh náročných na čtení zvažte zámky Slim Reader/Writer (SRW) nebo 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;
}