2012-03-20 4 views
0

スレッドを作成して何かをする必要があります。主な理由は、メインプログラムからできるだけ早く終了することです。 しかし、スレッドを切り離してメインプログラムを終了すると、スレッドは消滅します。私の例では、ファイルには期待されるデータが含まれていません。 メインプログラムを5秒間スリープさせると、すべて正常に動作します。perlスレッドがデタッチした後に終了する

メインプログラムを終了してスレッドを実行させるにはどうすればよいですか?

use threads; 
print "Starting main program\n"; 
my $t = threads->new(\&sub1)->detach(); 
print "End of main program\n"; 

sub sub1 { 
     print "started thread\n"; 

     open (FILE, ">>./test.txt") or die($!); 
     print FILE localtime(time())."\n"; 
     foreach (1..3){ 
      print FILE "$_\n"; 
      sleep 1; 
     } 
     close(FILE); 
     return 1; 
} 

答えて

3

非常に簡単にはできません。

  • $thr->detach()
    スレッドがjoin不可能なり、廃棄すべき最終的な戻り値を生じさせます。プログラムが終了すると、は、実行中の切り離されたスレッドはサイレントにと終了します。

しかし、あなたが行うことができます:

threads->new(\&sub1)->join(); 

しかし、それはほとんどあなたをずっと買っていません。あなたが何かをやり続けている間、スレッドは主に他のことをするために使われることを意図しているからです。実行の主な行を停止し、スレッドを実行する理由はほとんどありません。sub1();

+0

すぐにお返事ありがとうございます。私の場合、私は何かilkeシステム( "prg_name.pl")を使わなければならないと思います。 – shipik

1

スレッドを使用することはできませんが、スレッドをforkして待たずに親プロセスを終了させることができます終了する子プロセス:

my $pid = fork(); 
if ($pid == 0) { 
    print "child proc\n"; 
    sleep 5; 
    print "child, 5 seconds older\n"; 
    exit(0); 
} else { 
    print "parent proc. goodbye\n"; 
} 

子プロセスを制御できなくなったので、これはあまり良いアプローチではないと思います。なぜそれを主に実行し、プロセスをバックグラウンドで実行しないのですか?

を編集する:これはもちろん、システムリソースを消費するゾンビプロセスを生成する可能性があります。と脳。

+1

私はゾンビを作りたくありません:-)。私はちょうどシステム( "prg_name.pl&")でプロセスをバックグラウンドにしようとしました。それは機能しますが、私の場合は少し面倒な解決策です。 – shipik

関連する問題