【问题标题】:how to get exit status of thread如何获取线程的退出状态
【发布时间】:2014-06-13 07:32:04
【问题描述】:

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

【问题讨论】:

    标签: multithreading perl exitstatus


    【解决方案1】:

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

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

    if (defined $thread->error) ..
    

    来自perldoc

    $thr->error()

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 好的。如果发生异常(在 sub5 中除以零)或者如果用户在线程执行期间按 CTRL+C,那么如何在主程序中捕获它
      【解决方案3】:

      只返回您想要返回的值可能会更好。 join 返回该值。

      my $thread = async { return "foo" };
      say $thread->join();  # foo
      

      【讨论】:

        【解决方案4】:

        你总是可以让线程返回一个状态码,而不是调用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;
        }
        

        【讨论】:

          猜你喜欢
          • 2020-02-27
          • 2014-07-22
          • 1970-01-01
          • 1970-01-01
          • 2015-02-15
          • 1970-01-01
          • 2018-02-28
          • 1970-01-01
          • 2014-01-29
          相关资源
          最近更新 更多