C++ 这个线程会变成僵尸吗

C++ 这个线程会变成僵尸吗,c++,linux,pthreads,C++,Linux,Pthreads,我有一个程序,它启动一个线程(使用pthreads),该线程将为程序的其余部分执行一些后台任务。主程序在终端中运行,一个常见的用例是在它使用Ctrl-C自动退出之前关闭它。有人要求我改变我产生的线程,使其成为僵尸。我以前没有考虑过这个问题,我是多线程编程的新手。我创建了一个小的、完整的、自包含的测试程序,它应该模仿真实程序的行为 在下面的代码中,生成的线程是否有变成僵尸的风险?回想一下,使用Ctrl-C可以终止该程序,可能这是一种特殊情况,对此我不确定 现在,线程在MyThread对象被删除后继

我有一个程序,它启动一个线程(使用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;
}
#包括
#包括
#包括
类神话阅读
{
公众:
MyThread():_正在运行(false){
无效运行()
{
如果(!正在运行){
if(pthread_)create(&thread,NULL,
(void*)(*)(void*)运行线程,
NULL)==0){
正在运行=正确;
}
否则{

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


简而言之,您不需要因为有第二个线程在运行而执行任何特殊操作。

Ctrl+C
-默认情况下,退出程序将杀死整个进程树,包括所有子进程和线程。因此,除非您为SIGINT设置了自定义信号处理程序,否则无需担心。

感谢大家的帮助,快速且准确简而言之。我希望我尽了我的stackoverflow职责。如果父进程不在,进程不会变成僵尸。如果父进程死亡,进程将立即被init(pid 1)继承,并在完成时收获。只有在父进程仍在活动时终止,而父进程不收获时,进程才会变成僵尸(通过wait()或waitpid())。感谢珀塞尔先生的宝贵意见!