¿Por qué Windows 10 inicia subprocesos adicionales en mi programa?


Con Visual Studio 2015, en un nuevo proyecto vacío de C++, compile lo siguiente para la aplicación de consola:

int main() {
    return 0;
}

Establezca un punto de interrupción en el retorno e inicie el programa en el depurador. En Windows 7, a partir del punto de interrupción, este programa tiene solo un hilo. Pero en Windows 10, tiene cinco (!) hilos: el hilo principal y cuatro "hilos de trabajo" esperando en un objeto de sincronización.

¿Quién está iniciando el grupo de subprocesos (o cómo lo descubro)?

Author: Adrian McCarthy, 2016-01-16

2 answers

Crystal ball dice que la ventana Debug > Windows > Threads muestra estos subprocesos en ntdll.dll!TppWorkerThread. Asegúrese de habilitar Microsoft Symbol Server para ver esto usted mismo, use Herramientas > Opciones > Depuración > Símbolos.

Esto también sucede en VS2013, por lo que definitivamente no es causado por las nuevas características de diagnóstico de VS2015, la suposición de @Adam no puede ser correcta.

TppWorkerThread() es el punto de entrada para un subproceso de grupo de subprocesos. Cuando establezco un punto de interrupción con la función Debug > New Breakpoint > Punto de interrupción en esta función. Tuve la suerte de capturar este seguimiento de pila para el subproceso 1st threadpool cuando el subproceso 2nd threadpool comenzó a ejecutarse:

    ntdll.dll!_NtOpenFile@24()  Unknown
    ntdll.dll!LdrpMapDllNtFileName()    Unknown
    ntdll.dll!LdrpMapDllSearchPath()    Unknown
    ntdll.dll!LdrpProcessWork() Unknown
    ntdll.dll!_LdrpWorkCallback@12()    Unknown
    ntdll.dll!TppWorkpExecuteCallback() Unknown
    ntdll.dll!TppWorkerThread() Unknown
    kernel32.dll!@BaseThreadInitThunk@12()  Unknown
    ntdll.dll!__RtlUserThreadStart()    Unknown
>   ntdll.dll!__RtlUserThreadStart@8()  Unknown

Claramente el cargador está usando threadpool en Windows 10 para cargar DLL. Eso es ciertamente nuevo :) En este punto el hilo principal también se está ejecutando en el cargador, concurrencia en el trabajo.

Así que Windows 10 está aprovechando múltiples núcleos para inicializar el proceso más rápido. Mucho una característica, no un error:)

 22
Author: Hans Passant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-16 13:19:11

Es el grupo de subprocesos predeterminado. https://docs.microsoft.com/en-us/windows/desktop/procthread/thread-pools

Cada proceso tiene un grupo de subprocesos predeterminado.

 2
Author: Changming Sun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 06:47:10