Función InitializeCriticalSectionAndSpinCount (synchapi.h)
Inicializa un objeto de sección crítico y establece el número de giros de la sección crítica. Cuando un subproceso intenta adquirir una sección crítica bloqueada, el subproceso gira: entra en un bucle que itera los tiempos de recuento de giros, comprobando si se libera el bloqueo. Si el bloqueo no se libera antes de que finalice el bucle, el subproceso entra en suspensión para esperar a que se libere el bloqueo.
Sintaxis
BOOL InitializeCriticalSectionAndSpinCount(
[out] LPCRITICAL_SECTION lpCriticalSection,
[in] DWORD dwSpinCount
);
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 de varios procesadores, 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.
Valor devuelto
Esta función siempre se ejecuta correctamente y devuelve un valor distinto de cero.
Windows Server 2003 y Windows XP: Si la función se ejecuta correctamente, el valor devuelto es distinto de cero. Si se produce un error en la función, el valor devuelto es cero 0
. Para obtener información de error extendida, llame a GetLastError. A partir de Windows Vista, la función InitializeCriticalSectionAndSpinCount siempre se realiza correctamente, incluso en situaciones de memoria baja.
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. Sin embargo, 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. Por ejemplo, el administrador del montón usa un recuento de giros de aproximadamente 4000 para sus secciones críticas por montón.
Para compilar una aplicación que usa esta función, defina _WIN32_WINNT como 0x0403
o posterior. Para obtener más información, vea Usar los encabezados de Windows.
Ejemplos
Para obtener un ejemplo que usa InitializeCriticalSectionAndSpinCount, vea Using Critical Section Objects.
Requisitos
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 |