我正在编写一个perl脚本来获取父进程中每个线程的退出状态。如果我使用join(),我无法获得正确的退出状态。
如何从父进程中捕获每个线程的退出状态?
这是代码
foreach (@threads) {
$_->join();
}
sub sub1 {
print "I am thread1\n";
exit(20);
}
sub sub2 {
print "I am thread2\n";
}
sub sub3 {
print "I am thread3\n";
}
sub sub4 {
print "I am thread4\n";
}
sub sub5 {
my $i=10/0;
print "$i\n";
print "I am thread5\n";
}
答案 0 :(得分:1)
首先,您必须使用threads->exit
作为exit
退出整个过程。此外,您必须die
代替,在内部线程中向主线程发出异常信号。
主线程可以在使用
加入线程之前或之后检查异常if (defined $thread->error) ..
来自perldoc
$ thr->误差()
线程在eval上下文中执行。如果线程正常终止,此方法将返回undef。否则,它在其eval上下文中返回与线程执行状态相关联的$ @的值。
答案 1 :(得分:0)
如果有人可能想要捕获发生的任何错误,请不要使用exit来中止子例程。使用die代替,可以被eval捕获。 exit()函数并不总是立即退出。它首先调用任何已定义的END例程,但这些END例程本身可能不会中止退出。
答案 2 :(得分:0)
最好只返回想要返回的值。 join
会返回该值。
my $thread = async { return "foo" };
say $thread->join(); # foo
答案 3 :(得分:0)
您始终可以让线程返回状态代码,而不是调用exit()
。 join()
允许从子中捕获返回的结果,前提是您在合适的上下文中启动了线程。
my $thr = threads -> create ( \&sub1 );
foreach my $thr ( threads -> list() )
{
my $result = $thr -> join();
print "Got result of $result from thread ", $thr -> tid(),"\n";
}
sub1 {
print "I am thread1";
return 20;
}