【问题标题】:perl : Threads do not die when main process diesperl:当主进程死亡时线程不会死亡
【发布时间】:2013-08-30 16:01:51
【问题描述】:

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

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

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

现在,如果我在命令行中用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
}

谢谢

【问题讨论】:

  • 哪些线程? Perl 至少有两种线程实现。
  • 如果您能发布一个 runnable 示例,这样我们就可以验证问题了。没有这样的代码,剩下的只有问题:getEvents 来自哪里?为什么要使用共享变量而不是信号量进行通信? handle_Event的内容是什么?
  • 如果您尝试杀死进程的 PID 而不是文件名会发生什么?毕竟,kill -9 是无法避免的。我会说你做错了。
  • kill -9 MainProgram.pl 不适用于 kill
  • @el.pescado,不,它只有一个。 (嗯,还有 Coro,但显然没有使用。)

标签: multithreading perl


【解决方案1】:

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

从 POD:

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

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

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2014-06-19
    • 2014-09-16
    相关资源
    最近更新 更多