0

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

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

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

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

我完全感到困惑。如果我做 a 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
}

谢谢

4

1 回答 1

0

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

从 POD:

如果程序在所有线程都没有加入或分离的情况下退出,则会发出警告。

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

于 2013-09-01T01:32:10.630 回答