这个线程可以成为一个僵尸

时间:2011-10-03 20:02:33

标签: c++ linux pthreads

我有一个程序启动一个线程(使用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;
}

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

Ctrl+C - 默认情况下,程序将终止整个进程树,包括任何子进程和线程。所以除非你为SIGINT设置一个自定义信号处理程序,否则不用担心。