2011-12-07 1 views
1
 foreach $name (@project_list) 
    { 
       # a thread is created for each project 
       my $t = threads->new(\&do_work, $name); 
       push(@threads, $t); 
    } 

    foreach (@threads) { 
    my $thrd = $_->join; 
    print "Thread $thrd done\n"; 
    } 

    sub do_work { 
    # execute some commands here... 
    } 

project_listには40項目のリストがあります。各アイテムのスレッドを生成すると、結合メソッドは最初のスレッドが終了してから次のスレッドに移動するのを待機しますか?Perlのスレッド結合メソッドは、複数のスレッドを起動すると、最初のスレッドが終了するのを待ちますか?

これが当てはまる場合は、避けることができますか?私は、いくつかのスレッドが速く完了し、他のスレッドが待っていることを意味します。

詳細情報が必要な場合は教えてください。 ありがとうございます。

答えて

5

$_->join$_で指定されたスレッドが終了するのを待ちます。あなたが順番にそれらを押しているので、foreachは順番にリストを横断します。はい、最初のスレッドを待つでしょう。

すべてスレッドが完了するのを待っているので問題はありません。あなたが一番速いフィニッシャーか遅いフィニッシャーを待つかどうかは関係ありません - とにかく誰もが待っています。

3

なぜお待ちですか?後処理ステップの範囲によって異なります。

作業を開始する前にすべてのスレッドを終了させる必要がある場合、個々のスレッドの待機は避けられません。

後処理ステップが各スレッドの結果に固有である場合は、スレッド自体の後処理部分を作成することが可能でなければなりません。

どちらの場合も、$_->join foreach @threads;が行く方法です。終了するスレッドを待つ必要がない場合は


は、代わりにjoindetachコマンドを使用します。ただし、スレッドが返す可能性のある結果は破棄されます。

+0

スレッドはそれぞれのファイルに書き込みを行い、最後にファイルは1つのファイルにマージされます。スレッドはデータを共有しません。だから私はここでデタッチを使うことはできないと思う。 – infinitloop

+0

@rashid:それぞれ個別に後処理することもできません。ファイルをマージするには、すべてのスレッドが終了するまで待つ必要があります。失われた時間を「必要な廃棄物」と考えてください。 – Zaid

0

メインスレッドは、すべてのスレッドが実行されている間は実行されているため、すべてのスレッドが完了した時点を知る必要があります。キューまたはセマフォを実行できます。セマフォは最も簡単です: