2012-01-26 9 views
1

を使用して、フォークされた別の子プロセスが実行されているスレッドに参加することはできませんよ。は、私はメインスレッド/プロセスから物事を次の操作を行いたい、オープン

  1. は、パイプを使用して他のプロセスに伝えます。

  2. 特定のタスクを実行するスレッドを作成します。

  3. すべてのスレッドが完了するまで待ちます。

後、私がしようとしている擬似コードである:私はそれが結合可能であってもスレッドに参加しようとすると、

use threads; 
use IO::Handle; 
sub dummy { 
     print "\n!!!!". $$; 
     return 0; 
} 

open($handle, "| cat -v") || die "Unable to open connection to BT Driver: $!\n"; 

$handle->autoflush(1); 

#close $handle; If I uncomment this, threads can be joined. But I don't want to terminate this child process. 

$thr2 = threads->create(\&dummy); 
sleep 2; 
print "\n$thr2"; 
foreach $thr (threads->list(threads::joinable)) 
{ 
     print "\nIam here"; 
     print "\n!!!". $thr; 
     $thr->join(); 
} 

コードがはまり込みます。

私はここで何か根本的に間違っていますか? 私はPerl 5.10.0を使用しています

+0

「つまらない」とはどういう意味ですか?何が起こりますか? –

+0

私はプログラムが終了しない、またはさらに進んでいるということに固執しています。 $ thr-> join callはコードをブロックします。 1つのアクティブで終了した結合されていないスレッドでjoin call programのexitを削除した場合。私は次の出力を得ています:[root @ pe-lt154〜]#perl thread_trial.pl !!!! 9441 スレッド= SCALAR(0x9dbfed0) ここをクリック – user1170728

答えて

4

私はそれを試してコンパイルされたスレッドで5.10.0を持っていませんが、 "Iam here"で5.12.4がハングします。 5.14.1が完了するまで実行されます。

Perlスレッドには多くのバグがありますが、近年はずっと良くなっています。 5.10.0はおそらくバグがいっぱいになるでしょう。そしてそれを解決する最も簡単な方法(と多くの問題)はPerlをアップグレードすることです。

+0

ありがとう。コードは5.14.2で完了するまで実行されます。 – user1170728

関連する問題