如何在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
答案 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] ) );
让代码正常运行。