Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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;
}