这个线程可以成为僵尸

问题描述:

我有一个程序启动一个线程(使用pthreads),它将为程序的其余部分执行一些后台任务。主程序在终端中运行,常见的用例是在使用Ctrl-C自行退出之前将其关闭。有人问我是不同的线程我成为僵尸。我之前没有想过这个问题,而且我一般都是多线程编程的新手。我创建了我希望的是一个小的,但完整的自包含测试程序,它应该模仿真实程序的行为。这个线程可以成为僵尸

在下面的代码中,是否有产生线程成为僵尸的风险?回想一下,使用Ctrl-C可以杀死该程序,也许这是一种特殊的情况,我不确定这一点。

现在,线程在MyThread对象被删除后继续运行。这不是一个真正的问题,因为在真正的程序中,MyThread对象被销毁,就像程序即将退出一样。我只是想知道,在父母离开之后,这个线程永远不会成为系统中的僵尸。

我想我可以有一个互斥保护变量,我检查线程func每次迭代告诉我,如果我应该退出,并且我可以在MyThread析构函数中将此变量设置为true,但也许我不需要这样做吗? 对不起,有点长,感谢您的阅读和提前感谢任何帮助!

#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

谢谢大家的帮助,快速而简洁。我希望我尽我所能完成了我的计算器职责。 –

+1

如果父母不在,流程不会成为僵尸。如果父母死亡,该进程立即由init(pid 1)继承,并在完成时收回。一个进程只会在它的父代还活着时终止,而父进程不会收获(通过wait()或waitpid())。 –

线程不会成为僵尸;流程做。当你杀死一个进程时,它会自动杀死它的所有线程。

简而言之,你不需要做任何特殊的事情,只是因为你有第二个线程在运行。

Ctrl+C -out程序默认会终止整个进程树,包括任何子进程和线程。所以不用担心,除非您为SIGINT设置了一个自定义信号处理程序。