我有一些代码,它一次产生5个自己的线程。我分离这些线程,但有一个共享变量$THREADCOUNT
,我在线程调用调用的子过程开始时递增,并在线程结束时递减。当$THREADCOUNT
等于0时,我会再产生5次。
问题是,有时线程意外退出而$THREADCOUNT
从未使其为0,因此程序停止。有没有办法捕获这样的退出并在意外退出时$THREADCOUNT--
?
非常感谢。如果有点不清楚的话,这是我的第一篇文章。
克里斯
答案 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);
}
请注意,这可以解决代码中的问题,即线程在启动后的一小段时间内不会被计为启动。