如何使二维数组共享,所以我可以在线程中更改它,我会在另一个线程中看到它被更改? 谢谢
our @Cells=();
share(@Cells);
for $Row_Of_Cell (0..$Number_Of_Rows-1) {
$Cells[$Row_Of_Cell]=&share([]);
for $Column_Of_Cell (0..$Number_Of_Columns-1) {
$Cells[$Row_Of_Cell][$Column_Of_Cell]=0;
}
}
是吗?
答案 0 :(得分:2)
在Perl中没有二维数组这样的东西。数组只能包含标量。这包括引用,因此使用对数组的引用数组来近似2d数组。您需要使每个数组共享(使用share
),而不仅仅是基数。
请注意,这种共享通常表示设计较差(效率低且容易出错)。强烈建议尽可能使用工人模型。
答案 1 :(得分:1)
您还必须使用share
或shared_clone
分享内部结构:
#!/usr/bin/perl
use warnings;
use strict;
use threads;
use threads::shared;
my @ar2d : shared;
my @second : shared = qw/A B C D/;
@ar2d = ( shared_clone([qw/a b c d/]),
\@second,
);
my $thread = sub {
my $idx = shift;
while ('c' eq lc $ar2d[$idx][2]) {
print "In thread1 $ar2d[$idx][2]\n";
sleep 1;
}
};
my $thread1 = threads->create($thread, 0);
my $thread2 = threads->create($thread, 1);
for (1 .. 5) {
sleep 1;
print "In main $ar2d[0][2] $ar2d[1][2]\n";
}
$ar2d[0][2] = 'x';
$ar2d[1] = shared_clone([qw/A B X D/]);
print "In main $ar2d[0][2] $ar2d[1][2]\n";
$thread1->join;
$thread2->join;