【发布时间】:2015-11-05 07:48:55
【问题描述】:
我有一个线程应用程序,想为线程设置超时。 Peldoc for alarm 建议使用 eval-die 对并捕获 ALRM 信号。但是,这会失败,线程会产生错误Alarm clock:
use strict; use warnings;
require threads;
require threads::shared;
my $t = threads->create( sub {
eval {
$SIG{ALRM} = sub { die "alarm\n" };
alarm 2;
main();
alarm 0;
};
if ($@){
die $@ unless $@ eq "alarm\n";
print "timed out\n";
}
}
);
my @r = $t->join;
print "done\n";
sub main {
sleep 3;
}
This post 建议在 threads 库中调用 alarm 而无需信号处理程序。 Another post 是关于这个问题的,答案建议使用fork 和waitpid,但我真的很想使用threads。 Another post 声称想出了一个解决方案,但这仍然给我带来了 Alarm clock 错误。我试图在if ($@) 中捕捉Alarm clock,但没有成功。知道我该如何完成这项工作吗?
【问题讨论】:
-
我明白了。那么会有解决方法吗?我的整个应用程序确实依赖于
threads -
是的,使用除终止信号之外的其他机制。信号量或队列之类的东西。
标签: multithreading perl timeout pthreads