Bloqueo específico de Windows 10 en la llamada LeaveCriticalSection

Me encontré con un problema con la sincronización de subprocesos y las secciones críticas en Windows 10.

La aplicación se bloqueará en este caso:

La aplicación tiene dos hilos.El subproceso 1 llama a EnterCriticalSection con el objeto m_CSEl hilo 2 luego intenta ingresar a la misma sección críticaEl subproceso 1 termina el subproceso 2 utilizando TerminateThreadEl hilo 1 llama a LeaveCriticalSection

En versiones anteriores de Windows que pude probar (7, 8, 8.1), esto funciona correctamente. El subproceso 2 finaliza y el subproceso 1 abandona la sección crítica sin excepción.

En Windows 10, cuando Thread 1 abandona la sección crítica, la aplicación se bloquea con Infracción de acceso. Solo sucede cuando otro subproceso se terminó mientras esperaba EnterCriticalThread.

Mirando el rastro de la pila se ve esto (último cuadro en la parte superior):

RtlpWakeByAddress
RtlpUnWaitCriticalSection
RtlLeaveCriticalSection

Pasé mucho tiempo depurando este problema. En mi caso, m_CS está totalmente bien cuando se llamó a LeaveCriticalSection. Depuré y pasé algún tiempo para analizar el código desmontado de las funciones ntdll.dll. Parece que el objeto se corrompe en algún lugar durante la ejecución de RtlpUnWaitCriticalSection y luego se pasa a RtlpWakeByAddress cuando se produce un bloqueo. Básicamente, ntdll.dll pudo modificar las propiedades del objeto CRITICAL_SECTION, como el recuento de bloqueos en RtlLeaveCriticalSection.

Desde la web no encontré ninguna respuesta sobre esto o declaración sobre lo que cambió en Windows 10. Solo subprocesos en reddit y ~ 1800 informes de fallas para Mozilla Firefox con la misma pila de llamadas en el último mes. Me puse en contacto con el autor de la publicación en reddit y no pudo solucionar esto hasta ahora.

Entonces, ¿alguien se ocupó de este problema y puede tener una solución o consejos? Como solución en este momento, solo veo repensar el uso de WinAPI TerminateThread e intentar evitarlo tanto como sea posible. Otra forma de hacer una refactorización de código y pensar en la arquitectura de la aplicación.

Cualquier respuesta apreciada. Gracias por adelantado

Respuestas a la pregunta(3)

Su respuesta a la pregunta