0

我正在编写一个 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";
}
4

4 回答 4

1

首先,您必须使用threads->exitas exitexits 整个过程。此外,您必须die改为在线程内部向主线程发出异常信号。

主线程可以在加入线程之前或之后检查异常,使用

if (defined $thread->error) ..

来自perldoc

$thr->错误()

线程在 eval 上下文中执行。如果线程正常终止,此方法将返回 undef。否则,它会在其 eval 上下文中返回与线程执行状态相关联的 $@ 值。

于 2014-06-13T08:04:32.323 回答
0

Might be better off just returning the value you want to return. join returns that value.

my $thread = async { return "foo" };
say $thread->join();  # foo
于 2014-06-13T11:47:44.607 回答
0

您始终可以让线程返回状态码,而不是调用exit(). join()允许从 sub 捕获返回的结果,前提是您在合适的上下文中启动线程。

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;
}
于 2014-06-13T12:48:06.543 回答
0

如果有人可能想要捕获发生的任何错误,请不要使用 exit 中止子例程。使用 die 代替,它可以被 eval 捕获。exit() 函数并不总是立即退出。它首先调用任何已定义的 END 例程,但这些 END 例程本身可能不会中止退出。

另请参阅: http: //perldoc.perl.org/threads.html#EXITING-A-THREAD

于 2014-06-13T07:34:57.597 回答