Compartir a través de


Función EnterCriticalSection (synchapi.h)

Espera la propiedad del objeto de sección crítica especificado. La función se devuelve cuando se concede la propiedad al subproceso que realiza la llamada.

Sintaxis

void EnterCriticalSection(
  [in, out] LPCRITICAL_SECTION lpCriticalSection
);

Parámetros

[in, out] lpCriticalSection

Puntero al objeto de sección crítica.

Valor devuelto

Esta función no devuelve ningún valor.

Esta función puede generar EXCEPTION_POSSIBLE_DEADLOCK, también conocido como STATUS_POSSIBLE_DEADLOCK, si se agota el tiempo de espera de una operación de espera en la sección crítica. El intervalo de tiempo de espera se especifica mediante el siguiente valor del Registro: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CriticalSectionTimeout. No controle una posible excepción de interbloqueo; en su lugar, depure la aplicación.

Comentarios

Los subprocesos de un único proceso pueden usar un objeto de sección crítico para la sincronización de exclusión mutua. El proceso es responsable de asignar la memoria utilizada por un objeto de sección crítico, lo que puede hacer declarando una variable de tipo CRITICAL_SECTION. Antes de usar una sección crítica, algún subproceso del proceso debe llamar a InitializeCriticalSection o InitializeCriticalSectionAndSpinCount para inicializar el objeto.

Para habilitar el acceso mutuamente excluyente a un recurso compartido, cada subproceso llama a la función EnterCriticalSection o TryEnterCriticalSection para solicitar la propiedad de la sección crítica antes de ejecutar cualquier sección de código que tenga acceso al recurso protegido. La diferencia es que TryEnterCriticalSection devuelve inmediatamente, independientemente de si obtuvo la propiedad de la sección crítica, mientras que EnterCriticalSection se bloquea hasta que el subproceso pueda tomar posesión de la sección crítica. Cuando haya terminado de ejecutar el código protegido, el subproceso usa la función LeaveCriticalSection para renunciar a la propiedad, lo que permite que otro subproceso se convierta en propietario y acceda al recurso protegido. No hay ninguna garantía sobre el orden en el que los subprocesos en espera adquirirán la propiedad de la sección crítica.

Una vez que un subproceso tiene la propiedad de una sección crítica, puede realizar llamadas adicionales a EnterCriticalSection o TryEnterCriticalSection sin bloquear su ejecución. Esto evita que un subproceso se interbloquee mientras espera una sección crítica que ya posee. El subproceso escribe la sección crítica cada vez que EnterCriticalSection y TryEnterCriticalSection se realizan correctamente. Un subproceso debe llamar a LeaveCriticalSection una vez por cada vez que haya escrito la sección crítica.

Cualquier subproceso del proceso puede usar la función DeleteCriticalSection para liberar los recursos del sistema que se asignaron cuando se inicializó el objeto de sección crítica. Después de llamar a esta función, el objeto de sección crítica ya no se puede usar para la sincronización.

Si un subproceso finaliza mientras tiene la propiedad de una sección crítica, el estado de la sección crítica no está definido.

Si se elimina una sección crítica mientras sigue siendo propiedad, el estado de los subprocesos que esperan la propiedad de la sección crítica eliminada no está definido.

Mientras se cierra un proceso, si una llamada a EnterCriticalSection se bloquearía, en su lugar finalizará el proceso inmediatamente. Esto puede hacer que no se llame a los destructores globales.

Ejemplos

Para ver un ejemplo que usa EnterCriticalSection, vea Using Critical Section Objects.

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [aplicaciones de escritorio | aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado synchapi.h (incluye Windows.h en Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Library Kernel32.lib
Archivo DLL Kernel32.dll

Vea también

Objetos de sección críticos

DeleteCriticalSection

InitializeCriticalSection

InitializeCriticalSectionAndSpinCount

LeaveCriticalSection

Funciones de sincronización

TryEnterCriticalSection

API de Vertdll disponibles en enclaves de VBS