簡體   English   中英

如果啟動多個線程,Perl的線程連接方法是否會等待第一個線程完成?

[英]Does Perl's thread join method wait for the first thread to finish if I launch more than one thread?

     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個項目的列表。 當我為每個項目生成線程時,join方法會等待第一個線程完成,然后移至下一個線程,依此類推嗎?

如果是這樣,有可能避免嗎? 我的意思是有些線程會比其他線程更快地完成,所以為什么要等待?

如果需要更多信息,請告訴我。 謝謝。

$_->join等待$_指定的線程完成。 因為按順序推送它們,並且foreach按順序遍歷列表,所以可以,您首先要等待第一個線程。

但這無關緊要,因為您正在等待所有線程完成。 無論您是先等待最快的完成者還是最慢的完成者都沒關系-無論如何,您將一直在等待所有人。

干嘛要等? 這取決於后處理步驟的范圍。

如果后處理步驟需要所有線程在開始工作之前完成,那么不可避免地要等待各個線程。

如果后處理步驟特定於每個線程的結果,則應該可以使線程本身成為后處理的一部分。

在兩種情況下, $_->join foreach @threads; 是要走的路。


如果不需要等待線程完成,請使用detach命令而不是join 但是,線程可能返回的任何結果都將被丟棄。

主線程必須存在於所有線程的持續時間內,因此您需要知道它們何時完成。 可以完成隊列或信號量。 信號量是最簡單的:

use Thread::Semaphore;

my $S = Thread::Semaphore->new();


foreach $name (@project_list)
{
    # a thread is created for each project
    my $t = threads->new(\&do_work, $name);
    $S->down_force();                        # take one for each thread
} 

$S->down();                # this blocks until worker threads release one each
print "Thread $thrd done\n";


sub do_work {
    # execute some commands here...
    $S->up();             # here the worker gives one back when done.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM