perl:当主进程死亡时,线程不会死亡

时间:2013-08-30 16:01:52

标签: multithreading perl

我有一个perl程序,它产生了几个线程。每个线程处理一些任务(通过触发其他系统命令等),然后当它全部完成时,等待。

完成所有线程后,它们会向Parent进程发出信号。然后父进程加载新作业,并通知线程继续处理这些新任务。

理想情况下,这个程序会永远运行。

现在,如果我在kill -9 MainProgram.pl的命令行中杀死它,它就不会被杀死!我看到线程正在运行的作业的输出,然后我也看到它们完成后,它们会获得新的工作并且继续... ...

我绝对感到困惑。如果我做kill -9 MainProgram.pl,它应该杀掉它拥有的所有线程,对吧? 无论线程在做什么......

即使线程正在进行I / O,所以他们等待IO完成...我希望线程在当前任务完成后死掉。但显然,Main也在重新加载作业,因为线程一直在继续......

这种行为是否出现在perl中?

编辑:mainProgram.pl中的一些代码

use threads;
use threads::shared;

for (my $count = 0; $count <= $threadNum-1; $count++) {
  $t = threads->new(\&handleEvent, $count) ;
  push(@threads, $t);
}

#Parent thread:
while(1) {
  lock($parentSignal);
  cond_wait($parentSignal);
  getEvents();
  while(@eventCount== 0){
    sleep($parent_sleep_time);
    getEvents(); #Try to get events again until you get some new stuff to process
  }
  cond_broadcast($threadsDone); # threadsgo work on this
}

由于

1 个答案:

答案 0 :(得分:0)

根据我的理解,在退出之前,您应该在所有线程上join()detach()

来自POD:

  

如果程序退出而没有所有线程都已加入或   超然,然后会发出警告。

来源:http://metacpan.org/pod/threads