当我尝试运行第一个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" ;
}
如果有人能帮助我解决这个问题,我将感激不尽。
谢谢。
答案 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的版本。)