2014-06-13 3 views
0

나는 부모 프로세스로부터 각 스레드의 종료 상태를 얻기 위해 펄 스크립트를 작성하고있다. 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

입니다. 다이 대신에 다이를 사용하면 eval에 의해 갇힐 수 있습니다. exit() 함수가 항상 즉시 종료되는 것은 아닙니다. 정의 된 END 루틴을 먼저 호출하지만 이러한 END 루틴 자체가 종료를 중단하지 않을 수도 있습니다.

또한 참조 : http://perldoc.perl.org/threads.html#EXITING-A-THREAD

+0

ok. 예외가 발생하면 (sub5에서 0으로 나누기) 또는 사용자가 스레드 실행 중에 CTRL + C를 누른 경우 주 프로그램에서이를 캡처하는 방법 – shreeshail

1

먼저 당신이 exitthreads->exit는 전체 프로세스를 종료 사용해야합니다. 또한 대신 메인 스레드에 예외를 알리기 위해 스레드 내부에 die이 있어야합니다.

메인 쓰레드 전이나 perldoc

$ thr-> 오류()에서 사용하는 스레드

if (defined $thread->error) .. 

가입 한 후 예외를 확인할 수 있습니다

스레드가 실행됩니다 eval context. 스레드가 정상적으로 종료되면이 메소드는 undef를 리턴합니다. 그렇지 않으면, 스레드의 실행 상태와 관련된 $ @의 값을 해당 평가 컨텍스트에서 반환합니다.

0

반환하려는 값을 반환하는 것이 더 나을 수도 있습니다. join은 해당 값을 반환합니다.

my $thread = async { return "foo" }; 
say $thread->join(); # foo 
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; 
} 
관련 문제