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. Adquirir bloqueos en distinto orden desde distintos hilos es la causa más común de los interbloqueos. Tenga en cuenta también que EnterCriticalSection bloquea indefinidamente: use TryEnterCriticalSection para realizar intentos de adquisición sin bloqueo e implemente un bucle de reintento limitado con un tiempo límite si necesita adquirir el bloqueo con tiempo limitado.

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 predominio de lectura, considere los 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;
}