Terminación de un subproceso

La terminación de un subproceso tiene los siguientes resultados:

  • Los recursos que pertenecen al subproceso, como ventanas y enlaces, se liberan.
  • Se establece el código de salida del subproceso.
  • Se señala el objeto de subproceso.
  • Si el subproceso es el único subproceso activo en el proceso, el proceso finaliza. Para obtener más información, consulte Terminación de un proceso.

La función GetExitCodeThread devuelve el estado de finalización de un subproceso. Mientras se ejecuta un subproceso, su estado de finalización es STILL_ACTIVE. Cuando finaliza un subproceso, su estado de finalización cambia de STILL_ACTIVE al código de salida del subproceso.

Cuando finaliza un subproceso, el estado del objeto de subproceso cambia a señalado, liberando cualquier otro subproceso que hubiera estado esperando a que finalice el subproceso. Para obtener más información sobre la sincronización, consulte Sincronización de la ejecución de varios subprocesos.

Cuando finaliza un subproceso, su objeto de subproceso no se libera hasta que se cierran todos los identificadores abiertos al subproceso.

Cómo se finalizan los subprocesos

Un subproceso se ejecuta hasta que se produce uno de los siguientes eventos:

  • El subproceso llama a la función ExitThread .
  • Cualquier subproceso del proceso llama a la función ExitProcess .
  • La función de subproceso devuelve.
  • Cualquier subproceso llama a la función TerminateThread con un identificador al subproceso.
  • Cualquier subproceso llama a la función TerminateProcess con un identificador para el proceso.

El código de salida de un subproceso es el valor especificado en la llamada a ExitThread, ExitProcess, TerminateThread o TerminateProcess, o el valor devuelto por la función de subproceso.

Si exitThread finaliza un subproceso, el sistema llama a la función de punto de entrada de cada DLL adjunta con un valor que indica que el subproceso se desasocia del archivo DLL (a menos que llame a la función DisableThreadLibraryCalls ). Si ExitProcess finaliza un subproceso, las funciones de punto de entrada dll se invocan una vez para indicar que el proceso se está desasociando. Los archivos DLL no se notifican cuando un subproceso finaliza con TerminateThread o TerminateProcess. Para obtener más información sobre los archivos DLL, vea Bibliotecas de vínculos dinámicos.

Las funciones TerminateThread y TerminateProcess solo deben usarse en circunstancias extremas, ya que no permiten que los subprocesos limpien, no notifiquen a los archivos DLL adjuntos y no liberen la pila inicial. Además, los identificadores de los objetos que pertenecen al subproceso no se cierran hasta que finaliza el proceso. Los pasos siguientes proporcionan una mejor solución:

  • Cree un objeto de evento mediante la función CreateEvent .
  • Cree los subprocesos.
  • Cada subproceso supervisa el estado del evento mediante una llamada a la función WaitForSingleObject . Use un intervalo de tiempo de espera de espera de cero.
  • Cada subproceso finaliza su propia ejecución cuando el evento se establece en el estado señalado (WaitForSingleObject devuelve WAIT_OBJECT_0).