Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Perl错误:线程启动失败:共享标量的值无效_Multithreading_Perl - Fatal编程技术网

Multithreading Perl错误:线程启动失败:共享标量的值无效

Multithreading Perl错误:线程启动失败:共享标量的值无效,multithreading,perl,Multithreading,Perl,尝试运行测试代码时出现以下错误: 线程启动失败:./threaded\u test.pl第47行的共享标量值无效。 第47行是: %hoh=hoh(@new_数组) 我的意见: 如果删除第47行和引用%hoh的其他行,则脚本运行时不会出错 我可以创建一个新的散列%new_hash=(瘙痒=>“Scratchy”)没有错误,但是当我尝试从另一个子系统(第47行)中“返回”哈希时,它会导致上面的错误 不幸的是,我不能使用in/out队列,因为我使用的Thread::Queue版本太旧(并且安装在

尝试运行测试代码时出现以下错误:

线程启动失败:./threaded\u test.pl第47行的共享标量值无效。

第47行是:
%hoh=hoh(@new_数组)

我的意见:

  • 如果删除第47行和引用
    %hoh
    的其他行,则脚本运行时不会出错
  • 我可以创建一个新的散列
    %new_hash=(瘙痒=>“Scratchy”)没有错误,但是当我尝试从另一个子系统(第47行)中“返回”哈希时,它会导致上面的错误
不幸的是,我不能使用in/out队列,因为我使用的Thread::Queue版本太旧(并且安装在我无法控制的系统上),并且不支持通过队列返回哈希和哈希引用类型(根据)。显然,我的版本只支持通过队列返回的字符串

有没有办法成功做到这一点:
$hash{$string}{“jc”}=\%hoh

#!/usr/bin/perl
use strict;
use warnings;
use threads;
use Thread::Queue;
use constant NUM_WORKERS => 10;

my @out_array : shared = ();
main();

sub main
{
    my @results = test1();
    foreach my $item (@results) {
        print "item: $item\n";
    }
}

sub test1
{
    my $my_queue = Thread::Queue->new();
    foreach (1..NUM_WORKERS) {
        async {
            while (my $job = $my_queue->dequeue()) {
                test2($job);
            }
        };
    }
    my @sentiments = ("Axe Murderer", "Mauler", "Babyface", "Dragon");
    $my_queue->enqueue(@sentiments);
    $my_queue->enqueue(undef) for 1..NUM_WORKERS;
    $_->join() for threads->list();
    my @return_array = @out_array;
    return @return_array;   
}

sub test2
{
    my $string = $_[0];
    my %hash : shared;
    my @new_array : shared;
    my %new_hash : shared;
    my %hoh : shared;
    @new_array = ("tom", "jerry");
    %new_hash = (itchy => "Scratchy");
    %hoh = hoh(@new_array);
    my %anon : shared;

    $hash{$string} = \%anon;    
    $hash{$string}{"Grenade"} = \@new_array;
    $hash{$string}{"Pipe bomb"} = \%new_hash;
    $hash{$string}{"jc"} = \%hoh;
    push @out_array, \%hash;
    return;
}

sub hoh
{
    my %hoh;
    foreach my $item (@_) {
        $hoh{"jeepers"}{"creepers"} = $item;
    }
    return %hoh;
}

问题是,您试图在共享变量中存储对未共享内容的引用。如前所述,您需要使用
share
,或者您需要序列化数据结构。

我认为您不能从sub返回哈希,只能返回对它的引用(\%hoh)。然后使用->取消引用。另请参见,
$hoh{“jeepers”}{“爬行者”}
将始终是参数列表中调用
hoh()
子例程的最后一个元素如果可以安装脚本,则可以安装模块。您不需要任何特殊权限。谢谢。你在这里的解释有点不同,增加了我的理解力:)我把它改成
返回共享(%hoh)现在可以工作了。
#!/perl/bin/perl

use strict;
use threads;
use threads::shared;

my %hm_n2g:shared = ();

my $row = &share([]);
$hm_n2g{"aa"}=$row;
$row->[0]=1;
$row->[1]=2;
my @arr = @{$hm_n2g{"aa"}};
print @arr[0]." ".@arr[1]."\n";

#If you want to lock the hash in a thread-subroutine
{
lock(%hm_n2g)

}