Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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;
}