2011-03-10 104 views
1

我有一些代码,一次产生5个线程本身。我分离这些线程,但有一个共享变量$THREADCOUNT,我在线程调用的子进程开始时递增,并在线程结束时递减。当$THREADCOUNT等于0时,我再产卵5次。Perl - 捕获意外的终止

问题是,有时线程会意外退出,并且$THREADCOUNT永远不会将其设置为0,因此程序将停止。有没有办法捕获这样的出口,并在意外退出时有$THREADCOUNT--

非常感谢。这是我的第一篇帖子,如果它有点不清楚,那么这就是appologies。

克里斯

回答

1

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

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); 
} 

注意,这可修复作为开始一会儿它开始后一个线程没有算在你的代码的问题。