Perl - 捕获意外终止

时间:2011-03-10 22:16:03

标签: multithreading perl

我有一些代码,它一次产生5个自己的线程。我分离这些线程,但有一个共享变量$THREADCOUNT,我在线程调用调用的子过程开始时递增,并在线程结束时递减。当$THREADCOUNT等于0时,我会再产生5次。

问题是,有时线程意外退出而$THREADCOUNT从未使其为0,因此程序停止。有没有办法捕获这样的退出并在意外退出时$THREADCOUNT--

非常感谢。如果有点不清楚的话,这是我的第一篇文章。

克里斯

2 个答案:

答案 0 :(得分:1)

共享$THREADCOUNT变量真的有必要吗?拨打threads->list(threads::running)会告诉您是否有任何产卵仍在运行。

答案 1 :(得分:1)

我无法弄清楚何时有人想要使用detach。我会使用像

这样的东西
use threads;

my %workers;

sub start_worker {
   my $thread = threads->create(@_);
   $workers{$thread->tid} = $thread;
   return $thread;
}

sub collect_finished_workers {
   for my $thread (threads->list(threads::joinable)) {
      $thread->join()
         if delete($workers{$threads->tid});  # Don't assume we own all threads.
   }
}

sub get_worker_count {
   collect_finished_workers();
   return 0+keys(%workers);
}

请注意,这可以解决代码中的问题,即线程在启动后的一小段时间内不会被计为启动。