Uso de objetos de sección crítica

El siguiente ejemplo muestra cómo un subproceso se inicializa, entra en una sección crítica y sale de ella. Usa las funciones InitializeCriticalSectionAndSpinCount, EnterCriticalSection, LeaveCriticalSection y DeleteCriticalSection .

Warning

Riesgo de interbloqueo: Si un subproceso debe adquirir varias secciones críticas, siempre debe adquirirlas en un orden coherente y documentado en todos los subprocesos. La adquisición de bloqueos en diferentes órdenes desde diferentes subprocesos es la causa más común de interbloqueos. Ten en cuenta también que EnterCriticalSection bloquea indefinidamente: utiliza TryEnterCriticalSection para intentos de adquisición sin bloqueo e implementa un bucle de reintentos limitado con un plazo si necesitas una adquisición de bloqueo temporizada.

Note

Alternativa moderna de C++: Para el nuevo código, considere la posibilidad de usar std::mutex con std::lock_guard o std::scoped_lock (C++17), que proporcionan administración de bloqueos basada en RAII que garantiza la versión incluso cuando se producen excepciones. Para cargas de trabajo con gran volumen de lecturas, plantéate utilizar bloqueos Slim Reader/Writer (SRW) o 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;
}