我有一个使用threads
的多线程perl脚本,工作正常但是当它试图杀死被绞死的线程时我收到错误并且脚本存在:
for (0..$threads-1) {
$trl[$_] = threads->create(\&my_sub, $_);
$SIG{ALRM} = sub {
if ($trl->is_running) {
$trl->kill('ALRM');
}
}
}
for (@trl) {
alarm 10;
$_->join;
}
和
sub my_sub {
$SIG{ALRM} = sub {
threads->exit(1);
};
while (@site) {
{
lock(@site);
$url = shift @site;
}
和错误:
Can't call method "is_running" on an undefined value at test.pl line 61.
Perl exited with active threads:
9 running and unjoined
40 finished and unjoined
0 running and detached
第61行是:
if ($trl->is_running) {
答案 0 :(得分:4)
好的,请开启strict
和warnings
。这会告诉您@trl
和$trl
不是一回事。具体来说 - 你的主程序中的'信号处理程序' - 你每次启动一个线程时都会重新定义,所以它只会杀掉最新的一个。 (除非它不会,因为$tr1
未定义)。
我建议你不要混淆信号和线程 - 这更多地取决于你在做什么。但通常我会建议 - fork
和kill
。 thread
和Thread::Semaphore
或Thread::Queue
。