[Perl]:不是CODE参考...我的第一个脚本

时间:2011-04-03 20:08:42

标签: multithreading perl

当我尝试运行第一个Perl脚本时,我收到以下错误:

[id=0 @ 0] : IP address "3.3.3.3" corresponds to device "core". 
Thread 1 terminated abnormally: Not a CODE reference at ./dev_ithread.pl line 23.
[id=0 @ 1] : IP address "5.5.5.5" corresponds to device "border". 
Thread 2 terminated abnormally: Not a CODE reference at ./dev_ithread.pl line 23.

这是我到目前为止所写的内容

#!/usr/bin/perl

use strict ;
use warnings ;
use diagnostics ;
use threads ;
use Config ;

$Config{useithreads} || die("\n---> Please recompile Perl with \<ithreads\> included. \n") ;


# IP parameterization of network elements.
my %device_ip = ( 
            "core" => "3.3.3.3",
            "border" => "5.5.5.5",      
        ) ;

# Initialize devices' pool of threads.
my $index = 0 ;
my @device_thread = () ;
while( my ($key, $value) = each %device_ip )    
{ 
    push( @device_thread, threads->new(\&thread_job($key, $device_ip{$key}, $index))->join ) ;  $index = $index+1 ;
}

# Worker thread subroutine.
sub thread_job
{
    my ($device, $ip, $index) = @_ ;

    my $ithread = threads->tid() ;
    print "[id=$ithread @ $index] : IP address \"$ip\" corresponds to device \"$device\". \n" ;
}
如果有人能帮助我解决这个问题,我将感激不尽。 谢谢。

2 个答案:

答案 0 :(得分:4)

threads->new()的第一个参数必须是代码引用或函数名称。您正在执行该函数并尝试获取结果的代码引用(这很可能是一个真值,因为这是print返回的内容),因此错误。我想你的电话应该是这样的:

threads->new(\&thread_job, $key, $device_ip{$key}, $index)->join

答案 1 :(得分:4)

\&thread_job($key, $device_ip{$key}, $index)没有按照您的想法执行操作:它立即运行thread_job(...),然后生成对其结果的引用。 threads->new然后尝试在新线程中执行该引用,这不起作用,因为它不是对sub的引用。

您可能想要说sub { thread_job($key, $device_ip{$key}, $index) }。 (或@ musiKk的版本。)