2

Tom Christiansenのサンプルコードàlaperlthrtut)は、3から1000までのすべての素数を検索して出力する再帰的なスレッド実装です。

以下は、スクリプトの穏やかに適応されたバージョンです

#!/usr/bin/perl
# adapted from prime-pthread, courtesy of Tom Christiansen

use strict;
use warnings;
use threads;
use Thread::Queue;

sub check_prime {       
    my ($upstream,$cur_prime) = @_;     
    my $child;
    my $downstream = Thread::Queue->new;

    while (my $num = $upstream->dequeue) {          
        next unless ($num % $cur_prime);

        if ($child) {

            $downstream->enqueue($num);

        } else {

            $child = threads->create(\&check_prime, $downstream, $num);

            if ($child) {

                print "This is thread ",$child->tid,". Found prime: $num\n";

            } else {

                warn "Sorry. Ran out of threads.\n";
                last;
            }
        }
    }

    if ($child) {
        $downstream->enqueue(undef);
        $child->join;
    }
}

my $stream = Thread::Queue->new(3..shift,undef);
check_prime($stream,2);

Sorry. Ran out of threads私のマシン(ActiveStateとWin32の下)で実行すると、コードは' '警告で終了する前に118スレッド(最後の素数が見つかった:653)しか生成できませんでした。

作成できるスレッドの数が制限されている理由を理解するために、use threads;行を。に置き換えましたuse threads (stack_size => 1);。結果として得られたコードは、2000以上のスレッドをうまく処理しました。

誰かがこの振る舞いを説明できますか?

4

1 に答える 1

3

スレッドのドキュメントから:

プラットフォームごとのデフォルトのスレッドごとのスタックサイズは大幅に異なり、ほとんどの場合、ほとんどのアプリケーションで必要とされるよりもはるかに大きくなります。Win32では、Perlのmakefileはデフォルトのスタックを明示的に16MBに設定します。他のほとんどのプラットフォームでは、システムのデフォルトが使用されますが、これも必要以上に大きくなる可能性があります。
アプリケーションのニーズをより正確に反映するようにスタックサイズを調整することで、アプリケーションのメモリ使用量を大幅に削減し、同時に実行されるスレッドの数を増やすことができます。
Windowsでは、アドレス空間の割り当ての粒度は64 KBであるため、スタックをWin32 Perlの場合よりも小さく設定しても、それ以上のメモリは節約されないことに注意してください。

于 2010-03-14T15:28:50.870 に答える