如何获得线程的退出状态

时间:2014-06-13 07:32:05

标签: multithreading perl exitstatus

我正在编写一个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 个答案:

答案 0 :(得分:1)

首先,您必须使用threads->exit作为exit退出整个过程。此外,您必须die代替,在内部线程中向主线程发出异常信号。

主线程可以在使用

加入线程之前或之后检查异常
if (defined $thread->error) ..

来自perldoc

  

$ thr->误差()

     

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

答案 1 :(得分:0)

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

另见:http://perldoc.perl.org/threads.html#EXITING-A-THREAD

答案 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;
}