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

Multithreading perl:当主进程死亡时,线程不会死亡,multithreading,perl,Multithreading,Perl,我有一个perl程序,它产生了几个线程。每个线程处理一些任务(通过触发其他系统命令等),然后在完成所有任务后等待 一旦所有线程都完成了,它们就会向父进程发送一个信号。然后,父线程加载新作业,并向线程发出信号,让其执行这些新任务 所以理想情况下,这个程序将永远运行 现在,如果我在命令行中用kill-9mainprogram.pl杀死它,它就不会被杀死!我看到线程正在运行的作业的输出,然后我还看到在它们完成后,它们得到新的作业,然后继续下去 我完全糊涂了。如果我执行一个kill-9mainprogr

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

一旦所有线程都完成了,它们就会向父进程发送一个信号。然后,父线程加载新作业,并向线程发出信号,让其执行这些新任务

所以理想情况下,这个程序将永远运行


现在,如果我在命令行中用
kill-9mainprogram.pl
杀死它,它就不会被杀死!我看到线程正在运行的作业的输出,然后我还看到在它们完成后,它们得到新的作业,然后继续下去


我完全糊涂了。如果我执行一个
kill-9mainprogram.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
}
使用线程;
使用线程::共享;
对于(my$count=0;$count new(\&handleEvent,$count);
推送(@threads,$t);
}
#父线程:
而(1){
锁定信号;
cond_wait($parentSignal);
getEvents();
而(@eventCount==0){
睡眠(父母睡眠时间);
getEvents();#尝试再次获取事件,直到获得要处理的新内容
}
cond_broadcast($threadsDone)#threads继续做这个
}

谢谢

据我所知,您应该在退出之前在所有线程上执行
join()
detach()

从POD中:

如果程序退出时没有加入或删除所有线程 分离,则会发出警告


来源:

哪些线程?Perl至少有两种线程实现。如果您能发布一个可运行的示例,这样我们就可以验证问题,那就太好了。如果没有这样的代码,只剩下问题:
getEvents
从何而来?为什么要使用共享变量而不是信号量进行通信?这是什么
handle\u Event
的内容?如果您尝试删除进程的PID而不是文件名会发生什么?毕竟,kill-9是不可避免的。我认为您做得不对。
kill-9 MainProgram.pl
对于
kill
@el.pescado不,它只有一个。(当然,也有Coro,但显然没有使用它。)