2013-08-05 391 views
0

Perl對完成其任務的線程做了什麼?它是否讓它閒置或只是殺死它?下面我有一個基本的代碼結構,我想知道如何最優化它。Perl中的多線程管理

use threads; 
use Thread::Semaphore 

my $s = Thread::Semaphore->new($maxThreads); 
my @threads; 
my $thread; 

foreach my $tasktodo (@tasktodo) { 
    $s->down(); 
    $thread = threads->new(\&doThis); 
    push @threads, $thread; 
} 

foreach my $thr (@threads) { 
    $thr->join(); 
} 

sub doThis { 
    # blah blah 
    # completed, gonna let more threads run with $s->up() 
    $s->up(); 
} 

在這種情況下,一旦線程完成,我想釋放資源讓更多線程運行。我很擔心在循環結束時加入線程。如果在整個程序生命週期中它將創建4個線程,當加入時@threads仍然有4個線程?

比方說$maxThreads是2,它會運行2個線程,然後當這兩個線程完成時,它將被終止並運行2個線程。最後它只會加入或等待這兩個線程在運行?

編輯:我也不在乎這些線程的返回值,這就是爲什麼我想釋放資源。我加入的唯一原因是我希望在繼續執行腳本之前完成所有線程的完成。再一次,這是最好的實現嗎?

+0

請叫它'Perl',不'PERL'或'perl'至少'珍珠' – 2013-08-05 08:43:38

+0

對不起,現在我知道了。你能回答我的問題嗎? – kotsumu

回答

3

終止線程的常用方法是使用適當的返回值從入口點函數返回EXPR。

連接函數等待這個返回值,並清理線程。所以,在我看來你的代碼很好。

另一種方式來退出一個線程是這樣的:

threads->exit(status); 

此外,您還可以得到可連接線程的列表,包括:

threads->list(threads::joinable); 
+0

謝謝,我對此感到不確定。我知道退出線程,但我不知道是否需要在線程結束時(因爲它現在正在工作,我還沒有壓力測試它,很快)。 – kotsumu