Perl线程和共享变量

时间:2014-05-26 14:47:29

标签: multithreading perl shared-memory

如何在Perl中共享数组列表?

我在子线程中的代码:

@token_list = (@token_list, [$token, time() + 1200]);

我在主要子代码中的代码:

my @array1 = [];
my @token_list : shared = ();
.
.
.
$thr = threads->new(\&connect, $c, $r);
.
.
.
foreach my $token_tab (@token_list)                                    
{               
   @array1 = @$token_tab;
   print "List content: $array1[0] $array1[1]\n";   
}

因为柔软永远不会进入foreach

1 个答案:

答案 0 :(得分:0)

首先关闭 - threads在perl中被正式劝阻:

  

"基于解释器的线程"由Perl提供的并不是人们可能期望或希望的快速,轻量级的多任务处理系统。线程的实现方式使其易于滥用。很少有人知道如何正确使用它们或能够提供帮助。   官方不鼓励在perl中使用基于解释器的线程。

无论如何,除此之外 - 你谈到共享嵌套数据结构。你做的那种方式并不起作用。

问题是 - perl处理多维数据结构的方式是通过引用。

所以使用@token_list

my @token_list = (@token_list, [$token, time() + 1200]);

实际在做:

my @token_list : shared;
my $anon_array = [ $token, time() + 1200 ];
@token_list = ( @token_list, $anon_array ); 

并且由于$anon_array 未共享,因此无法正常使用'。为此,您需要分享' sub'阵列分开。 share效果不佳,但shared_clone确实有效。

use strict;
use warnings;
use threads;
use threads::shared;
use Data::Dumper;

my @array_of_arrays : shared;

for ( 0 .. 5 ) {
    my $array_ref = [ 1, 2, 3, 4, 5 ];
    push( @array_of_arrays, shared_clone($array_ref) );
}

print Dumper \@array_of_arrays;

sub inc_all_elements {
    foreach my $outer (@array_of_arrays) {
        foreach my $inner (@$outer) {
            $inner++;
        }
        push( @$outer, 8 );
    }
}

for ( 1 .. 5 ) {
    threads->create( \&inc_all_elements );
}

foreach my $thr ( threads->list ) {
    $thr->join;
}

print Dumper \@array_of_arrays;

这使内部数组引用'共享'以及外部,这是你的代码中缺少的东西。

我认为这意味着它将如此简单:

@tokens = ( @tokens, shared_clone(  [$token, time() + 1200] ) );

让代码正常运行。