Usando objetos de seção crítica

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

Warning

Risco de impasse: Se um thread tiver de adquirir múltiplas secções críticas, adquira-as sempre numa ordem consistente e documentada em todos os threads. Adquirir bloqueios em diferentes ordens de diferentes threads é a causa mais comum de deadlocks. Note também que EnterCriticalSection bloqueia indefinidamente — use TryEnterCriticalSection para tentativas de aquisição sem bloqueio e implemente um ciclo de repetição limitado com um tempo limite, se precisar de aquisição temporizada do bloqueio.

Note

Alternativa moderna em C++: Para código novo, considere utilizar std::mutex com std::lock_guard ou com std::scoped_lock (C++17), que fornecem uma gestão de bloqueios baseada no princípio RAII, garantindo a sua libertação mesmo quando são lançadas exceções. Para cargas de trabalho com muitas operações 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;
}