Tom Christiansen's example code(點菜perlthrtut)是3和1000之間爲什麼我的ActivePerl程序報告'抱歉。跑出線程'?
下面查找和打印所有質數的遞歸,線程實現是稿件的溫和改編版本
#!/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);
當我運行(在ActiveState & Win32下),該代碼只能在產生'Sorry. Ran out of threads
'警告之前產生118個線程(發現最後一個素數:653)。
在試圖找出爲什麼我被限制爲可以創建的線程數時,我用use threads (stack_size => 1);
替換了use threads;
行。由此產生的代碼愉快地處理了2000多個線程。
任何人都可以解釋這種行爲嗎?
這很有趣。使用'$ child-> get_stack_size;'我得到'8096'。我假設這是以字節爲單位的,對吧? – Zaid 2010-03-14 16:31:08
Windows文檔(http://msdn.microsoft.com/zh-cn/library/ms686774%28VS.85%29.aspx)提及64 kByte作爲一個典型的大小, 找到您需要調用的實際大小GetSystemInfo。這甚至可能是CPU體系結構依賴。 – weismat 2010-03-14 17:31:40
此鏈接(http://www.perlmonks.org/?node_id=31432)可能會幫助您從perl獲取數據。 – weismat 2010-03-14 17:33:14