Función InitializeCriticalSectionEx (synchapi.h)

Inicializa un objeto de sección crítico con un número de giros y marcas opcionales.

Sintaxis

BOOL InitializeCriticalSectionEx(
  [out] LPCRITICAL_SECTION lpCriticalSection,
  [in]  DWORD              dwSpinCount,
  [in]  DWORD              Flags
);

Parámetros

[out] lpCriticalSection

Puntero al objeto de sección crítica.

[in] dwSpinCount

El recuento de rotación para el objeto de la sección crítica. En los sistemas de un solo procesador, se omite el número de giros y el número de giros de sección crítico se establece en 0 (cero). En los sistemas multiprocesador, si la sección crítica no está disponible, el subproceso que realiza la llamada gira los tiempos dwSpinCount antes de realizar una operación de espera en un semáforo asociado a la sección crítica. Si la sección crítica se libera durante la operación de giro, el subproceso que llama evita la operación de espera.

[in] Flags

Este parámetro puede ser 0 o el valor siguiente.

Valor Significado
CRITICAL_SECTION_NO_DEBUG_INFO La sección crítica se crea sin información de depuración.

Valor devuelto

Si la función se realiza correctamente, el valor devuelto es distinto de cero.

Si la función no se realiza correctamente, el valor devuelto es cero (0). Para obtener información de error extendida, llame a GetLastError.

Comentarios

Los subprocesos de un único proceso pueden usar un objeto de sección crítico para la sincronización de exclusión mutua. No hay ninguna garantía sobre el orden en que los subprocesos obtienen la propiedad de la sección crítica, pero el sistema es justo para todos los subprocesos.

El proceso es responsable de asignar la memoria utilizada por un objeto de sección crítico, que puede hacer declarando una variable de tipo CRITICAL_SECTION. Antes de usar una sección crítica, algún subproceso del proceso debe inicializar el objeto . Posteriormente, puede modificar el número de número llamando a la función SetCriticalSectionSpinCount .

Una vez inicializado un objeto de sección crítica, los subprocesos del proceso pueden especificar el objeto en la función EnterCriticalSection, TryEnterCriticalSection o LeaveCriticalSection para proporcionar acceso mutuamente excluyente a un recurso compartido. Para una sincronización similar entre los subprocesos de distintos procesos, use un objeto de exclusión mutua.

No se puede mover ni copiar un objeto de sección crítico. El proceso tampoco debe modificar el objeto, pero debe tratarlo como opaco lógicamente. Use solo las funciones de sección críticas para administrar objetos de sección críticos. Cuando haya terminado de usar la sección crítica, llame a la función DeleteCriticalSection .

Se debe eliminar un objeto de sección crítico antes de que se pueda reinicializar. La inicialización de una sección crítica que ya está inicializada da como resultado un comportamiento indefinido.

El número de giros es útil para secciones críticas de corta duración que pueden experimentar altos niveles de contención. Considere un escenario en el que una aplicación de un sistema SMP tiene dos o tres subprocesos que asignan y liberan memoria del montón constantemente. La aplicación serializa el montón con una sección crítica. En el peor de los casos, la contención de la sección crítica es constante y cada subproceso realiza una llamada intensiva de procesamiento a la función WaitForSingleObject . Sin embargo, si el número de número de número se establece correctamente, el subproceso que realiza la llamada no llama inmediatamente a WaitForSingleObject cuando se produce la contención. En su lugar, el subproceso que realiza la llamada puede adquirir la propiedad de la sección crítica si se libera durante la operación de giro.

Puede mejorar significativamente el rendimiento si elige un número de giros pequeño para una sección crítica de corta duración. El administrador del montón usa un recuento de giros de aproximadamente 4000 para sus secciones críticas por montón. Esto proporciona un gran rendimiento y escalabilidad en casi todos los escenarios de peor caso.

Requisitos

Requisito Value
Cliente mínimo compatible Windows Vista [aplicaciones de escritorio | aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2008 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado synchapi.h (incluye Windows.h en 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

API de Vertdll disponibles en enclaves de VBS