如何将线程共享数组变量复制到普通数组

时间:2013-10-01 15:49:15

标签: arrays multithreading perl perl-module

我有一个存储对象的共享数组。

package A;
use threads;
use threads::shared;
our @LISTS;
share(@LISTS);
use B;

my $obj = B->new();
my $shared_test = shared_clone($obj);
push(@A::LISTS, $shared_test);

我想将LISTS共享数组复制到普通数组。

我将它复制到另一个模块中的两个数组中,当我修改一个数组时,它会影响到另一个数组。 这是代码

my @test1 = @A::LISTS;
my @test2 = @A::LISTS;
$test1[0]->set_value("1");
print "value: ".$test1[0]->get_value()."\n";
$test2[0]->set_value("2");
print "value2: ".$test2[0]->get_value()."\n";
print "value1: ".$test1[0]->get_value()."\n";

输出:

value: 1
value2: 2
value1: 2

但我想要@ test1,@ test2数组来自共享。我该怎么办?

我想输出

value: 1
value2: 2
value1: 1

修改后的值不应影响另一个数组

1 个答案:

答案 0 :(得分:0)

在这种情况下,分享是一个红鲱鱼。如果省略它,你会看到相同的行为。

@A::LISTS的元素是受祝福的引用,数组副本中的元素也是如此。因此,$A::LISTS[0]指向内存中的某个位置,而$test1[0]中的副本指向同一位置 - 换句话说,它们包含相同的对象。

您需要明确单独制作对象副本以达到您想要的效果:

use Clone qw(clone);

my @copies = map { clone($_) } @A::LISTS;