2011-10-03 13 views
5

Tengo un programa que inicia un hilo (usando pthreads) que hará algunas tareas en segundo plano para el resto del programa. El programa principal se ejecuta en un terminal y un caso de uso común es cerrarlo antes de que salga solo con Ctrl-C. Alguien me pidió que cambiara los hilos que engendro para convertirme en zombies. No había pensado en este problema antes y soy un principiante en la programación de subprocesos múltiples en general. Creé lo que espero sea un programa de prueba pequeño, pero completo e independiente que debe imitar el comportamiento del programa real.¿Puede este hilo convertirse en un zombi?

En el siguiente código, ¿existe el riesgo de que el hilo generado se convierta en zombie? Recuerda que el programa podría ser eliminado usando Ctrl-C, tal vez sea un escenario especial, no estoy seguro de eso.

En este momento, el hilo sigue ejecutándose después de que se haya eliminado el objeto MyThread. Esto no es realmente un problema, porque en el programa real, el objeto MyThread se destruye justo cuando el programa está a punto de salir de todos modos. Solo quiero saber que el hilo nunca corre el riesgo de convertirse en un zombie en el sistema una vez que el padre se haya ido.

Supongo que podría tener una variable protegida por mutex que compruebe el hilo func en cada iteración para decirme si debería salir, y podría establecer esta variable en true en el destructor MyThread, pero quizás no lo haga necesito hacer eso? Lo siento, me puse un poco largo, gracias por leer y gracias de antemano por cualquier ayuda!

#include <iostream> 
#include <pthread.h> 
#include <unistd.h> 

class MyThread 
{ 
public: 
    MyThread() : is_running(false) {} 

    void Run() 
    { 
     if (!is_running) { 
     if (pthread_create(&thread, NULL, 
          (void * (*)(void *))RunThread, 
          NULL) == 0) { 
      is_running = true; 
     } 
     else { 
      std::cerr << "pthread_create() failed." << std::endl; 
     } 
     } 
     else { 
     std::cout << "The thread was already running." << std::endl; 
     } 
    } 
private: 
    static void * RunThread(void */*arg*/) 
    { 
     while (true) { 
     sleep(1); 
     std::cout << "Hello from RunThread" << std::endl; 
     } 
     return NULL; 
    } 

    pthread_t thread; 
    bool is_running; 
}; 

int main() 
{ 
    MyThread *thread = new MyThread; 

    thread->Run(); 

    std::cout << "Going to sleep for five seconds." << std::endl; 
    sleep(5); 
    std::cout << "No longer asleep, deleting thread object." << std::endl; 

    delete thread; 

    std::cout << "Hit enter to exit program." << std::endl; 
    std::cin.get(); 

    return 0; 
} 
+0

http://stackoverflow.com/questions/7285109/unix-zombies-and-daemons/7285149#7285149 –

+0

Gracias a todos por su ayuda, de forma rápida y concisa. Espero haber hecho mis tareas de stackoverflow como debería. –

+1

Un proceso no se convierte en un zombie si su padre se ha ido. Si el padre muere, el proceso es heredado inmediatamente por init (pid 1) y será cosechado cuando se complete. Un proceso solo se convierte en un zombi si termina mientras su padre todavía está vivo, y el padre no lo cosecha (a través de wait() o waitpid()). –

Respuesta

3

Los hilos no se vuelven zombis; los procesos lo hacen. Cuando matas un proceso, esto automáticamente mata a todos sus hilos.

En pocas palabras, no necesita hacer nada especial solo porque tiene un segundo hilo ejecutándose.

0

Ctrl+C -salida de un programa matará de forma predeterminada todo el árbol de procesos, incluidos los procesos secundarios y los subprocesos. Así que no te preocupes a menos que configures un manejador de señal personalizado para SIGINT.

Cuestiones relacionadas