2010-12-01 18 views
6

He leído algunas fuentes sobre métodos adecuados para enviar un mensaje desde un hilo a todos los otros hilos para salir con elegancia (cada hilo realiza su propia rutina de salida). De estos, me gustó la idea de un booleano atómico global que pueda marcarse desde cualquier subproceso, y todos los demás hilos comprueban este indicador para realizar una rutina de salida: cuando todos los hilos se unen, el hilo principal puede salir de la aplicación.Salida eficiente de la aplicación multiproceso (detalles)

Los hilos puramente computacionales probablemente se manejarían de manera diferente, ¿no?

¿Es esto eficiente y seguro? ¿Hay una mejor manera de hacer esto?

Gracias!

Respuesta

1

En Windows, uso QueueUserAPC para llamar a una función que arroja una excepción, haciendo que los subprocesos salgan limpiamente.

me escribió más sobre los detalles de esta respuesta aquí:

How do I guarantee fast shutdown of my win32 app?

En resumen, esto es lo que sucede:

Say hilo A quiere dar por terminado el hilo B (y C, D, ...)

  • Tema a llama QueueUserAPC(), pasando por el mango al hilo B y la dirección de una función, que lanzará una excepción de la clase Mi ThreadExit.
  • El subproceso B se ejecuta normalmente hasta que llama a algo que comprueba si hay esperas alertables. Tal vez WaitForSingleObjectEx, tal vez SleepEx, o algo más.
  • En este punto, el subproceso B ejecuta la función APC pasada, causando la excepción en el Subproceso B.
  • Todos los objetos asignados a la pila se destruyen automáticamente correctamente ya que la excepción hace que el subproceso B "desenrolle" su pila.
  • La función de rosca más externa de la rosca B captará la excepción.
  • El hilo B ahora sale, posiblemente indicando al hilo A que está hecho.
+0

suena inteligente, pero simplemente no puedo sacudir la sensación de "esto es demasiado hacky" cada vez que lo leo ... – Necrolis

+0

Admitiré que no es portátil, pero la mayoría de las otras soluciones realmente restringen lo que los terceros código que puedes usar en tus hilos. Utilizo mucho los hilos para la creación de redes, y necesito bibliotecas de redes de terceros (por ejemplo, Indy) que puedan 'detenerse' de forma segura. – Roddy

+0

Todavía no lo entiendo, incluso de la explicación más detallada. Utiliza QueueUserAPC cuando desea salir dentro de un hilo y, finalmente, llama a una función que arroja una excepción y esta excepción llega a cada hilo? ¿Cómo se llaman los destructores y cómo se ve la función de lanzamiento de excepción? (Toda esta área de programación es nueva para mí) ¡Gracias! – oneminute

4

No soy partidario de que los hilos verifiquen variables de estado booleanas (u otras) para saber cuándo hacer qué, porque es un desperdicio. Los hilos tendrían que girar, verificando constantemente la variable para ver si hay nuevas instrucciones. Esto quema la CPU.

Una mejor opción es crear un semáforo o en Windows un evento, y tener todos los hilos pendientes de eso. Los hilos pueden dormir mientras no están ocupados, y no roban fragmentos de tiempo de otros hilos haciendo un trabajo real simplemente para verificar una variable.

+0

(Soy nuevo en teoría paralela) Mi aplicación es exclusivamente Windows - ¿Cómo esperan los hilos en un evento? ¿Algún recurso al que me puedas dirigir? – oneminute

+0

En Windows, usaría la familia de funciones WaitForSingleObject() para esperar un evento creado por CreateEvent(). Enlace: http://msdn.microsoft.com/en-us/library/ms682396(VS.85).aspx –

+0

Estoy un poco confundido ... así que en cada hilo verifico el retorno de WaitForSingleObject (exitHandle, 0) para ver si el evento de salida está señalizado? – oneminute

Cuestiones relacionadas