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. Adquirir bloqueios em pedidos diferentes de threads diferentes é a causa mais comum de deadlocks. Observe também que o EnterCriticalSection bloqueia indefinidamente — use TryEnterCriticalSection para tentativas de aquisição sem bloqueio e implemente um loop de repetição limitado com um prazo se precisar de aquisição de bloqueio cronometrada.

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 predominância de leitura, considere bloqueios Slim Reader/Writer (SRW) 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;
}