perl线程问题

时间:2010-06-13 21:44:02

标签: perl multithreading

我正在使用perl编写一个多线程网站正常运行时间检查程序,这是迄今为止的基本代码(仅包括线程部分):

#!/usr/bin/perl

use LWP::UserAgent; 
use Getopt::Std; 
use threads; 
use threads::shared; 

my $maxthreads :shared = 50;
my $threads :shared = 0;

print "Website Uptime Checker\n";
my $infilename = $ARGV[0];
chomp($infilename);
open(INFILE, $infilename);
my $outfilename = $ARGV[1];
chomp($outfilename);
open(OUTFILE, ">" . $outfilename);
OUTFILE->autoflush(1);
while ($site = <INFILE>)
{
    chomp($site);
    while (1)
    {
        if ($threads < $maxthreads)
        {
            $threads++;
            my $thr = threads->create(\&check_site, $site);
            $thr->detach();
            last;
        }
        else
        {
            sleep(1);
        }
    }
}
while ($threads > 0)
{
    sleep(1);
}

sub check_site
{
    $server = $_[0];
    print "$server\n";
    $threads--;
}

一段时间后出现错误:

  

无法在C:\ perl \ webchecker.pl第28行第245行调用未定义值的方法“detach”。

导致此错误的原因是什么?我知道它正在分离,但我的代码中我做错了什么? Windows显示大量可用内存,因此它不应该是计算机内存不足,即使我将$ maxthreads设置为低至10甚至更​​低,也会发生此错误。

1 个答案:

答案 0 :(得分:1)

具体问题是thread->create无法创建线程,因此它返回undef。如果您希望代码更强大,则应在致电thr之前检查detach的值。