Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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/8/perl/10.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_Hash_Share - Fatal编程技术网

Multithreading 如何在多线程perl中共享哈希

Multithreading 如何在多线程perl中共享哈希,multithreading,perl,hash,share,Multithreading,Perl,Hash,Share,共享散列的一种方法是声明每一级别的散列,如: my %hash : shared; $hash{test} = &share({}); 但是,如果第一级密钥的数量无法预测,或者太多以至于您无法声明每个密钥,该怎么办呢 如下面的代码所示: #!/usr/bin/perl -w use strict; use threads; use threads::shared; my %counts :shared; my $infile = $ARGV[0]; open my $inf, "$i

共享散列的一种方法是声明每一级别的散列,如:

my %hash : shared;
$hash{test} = &share({});
但是,如果第一级密钥的数量无法预测,或者太多以至于您无法声明每个密钥,该怎么办呢

如下面的代码所示:

#!/usr/bin/perl -w
use strict;
use threads;
use threads::shared;

my %counts :shared;
my $infile = $ARGV[0];
open my $inf, "$infile";

while(my $inline = <$inf>){
    chomp($inline);
    my @entry = split(/\t/,$inline);
    my $t = threads->create('WORK',@entry)->join;
}

foreach my $i(sort {$a cmp $b} keys %counts){
    foreach my $j(sort {$a cmp $b} keys %{$counts{$i}}){
        print "$i\t$j\t$counts{$i}{$j}\n";
    }
}

sub WORK{
    my @work = @_;
    $counts{$work[0]}{$work[1]}++;
}
脚本将通过警告您“某行的共享标量值无效”而停止。那么有没有一种方法可以共享%counts和%{$counts{KEY1}}?假设我不知道在测试集第1列中我将观察到多少种水果,并且输出应该如下所示:

apple    pie      1
banana   icecream 1
mango    juice    1
mango    pie      2
orange   juice    1

在您的脚本中,您依赖于自动激活:散列和数组一旦被引用,就会突然出现。这通常有效。当
使用线程时,它不会出现(默认情况下,自动激活的数据结构不共享)。如果需要的话,我们可以自己创建子文件夹。这将使您的
工作
sub

sub WORK{
  unless (exists $counts{$_[0]}) {
    my %anon :shared;
    $counts{$_[0]} = \%anon;
  }
  $counts{$_[0]}{$_[1]}++;
}

或类似的。我还删除了对
@
数组相当无用的复制

请注意,您的示例甚至不需要线程。因为你知道

my $t = threads->create('WORK',@entry)->join;
这几乎完全等同于

my $t = WORK(@entry);

另外,
join
返回线程的返回值(在本例中是增量之前的计数,因为它是最后一条语句的值),而不是线程对象。

谢谢!我知道它可以简化,我创建这个示例只是为了学习如何在perl中使用多线程。但是在第二种解决方案中,你是指/=还是| |=?@lolibility我使用了
/=
。它的意思是“未定义时分配”
$a/=$b
$a=定义的$a相同吗$a:$b
。这在古代珍珠中是不可用的。但是,
| |=
也可以。
my $t = threads->create('WORK',@entry)->join;
my $t = WORK(@entry);