1

如何使二维数组共享,所以我可以在线程中更改它,我会看到它在另一个线程中更改?谢谢

    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; 
            } 
    } 

那正确吗?

4

2 回答 2

2

Perl 中没有二维数组这样的东西。数组只能包含标量。这包括引用,因此二维数组使用数组的引用数组来近似。您需要使每个数组共享(使用share),而不仅仅是基本数组。

请注意,这种共享通常表示设计不佳(效率低下且容易出错)。如果可能,强烈建议使用工人模型。

于 2013-04-22T08:26:27.833 回答
1

您还必须使用shareor共享内部结构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;
于 2013-04-22T08:43:39.903 回答