Usando objetos de seção críticos

O exemplo a seguir mostra como um thread inicializa, insere e libera uma seção crítica . Ele usa as funçõesInitializeCriticalSectionAndSpinCount, EnterCriticalSection, LeaveCriticalSectione DeleteCriticalSection.

Aviso

Risco de deadlock: Se um thread precisar adquirir várias seções críticas, adquira-as sempre em uma ordem consistente e documentada em todos os threads. A aquisição de bloqueios em ordens diferentes a partir de threads diferentes é a causa mais comum de impasses. Observe também que EnterCriticalSection bloqueia indefinidamente — use TryEnterCriticalSection para tentativas de aquisição não bloqueantes e implemente um loop de repetição limitado com um prazo limite se precisar de aquisição de bloqueio temporizada.

Note

Alternativa moderna do C++: Para um novo código, considere usar std::mutex com std::lock_guard ou std::scoped_lock (C++17), que fornece gerenciamento de bloqueio baseado em RAII que garante a liberação mesmo quando exceções são lançadas. Para cargas de trabalho com muitas leituras, considere Slim Reader/Writer (SRW) Locks ou 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;
}