我希望你们中的某个人能够帮助我解决我的问题。我试图在线程计算期间访问对象的全局共享数组,并且总是得到错误“使用未初始化的值”,尽管我可以打印它们的哈希值。
此外,由于使用来自 bioperl 的 seqio 对象,我无法更改我的对象。
以下示例显示了我的问题。
提前致谢。
对象类:
package obj;
use strict;
use warnings;
require Exporter;
our @ISA = qw(Exporter);
sub new(){
my $class=shift;
my $this = {};
$this->{"data"} = ();
bless($this,$class);
return($this);
}
sub getData(){
my $this=shift;
return $this->{"data"};
}
sub setData($){
my $this=shift;
$this->{"data"}=shift;
}
测试类:
use strict;
use warnings;
use threads;
use threads::shared;
use obj;
my @objs : shared;
foreach (0..2){
my $o = obj->new();
$o->setData($_);
push @objs, share($o);
}
my @threads=();
$#threads=3;
my $started;
for (my $i=0; $i<10; $i+=$started){
$started=0;
foreach (0..$#threads){
if (not defined $threads[$_]){
$threads[$_]=threads->new(\&run,(\@objs));
$started++;
} elsif($threads[$_]->is_joinable()){
$threads[$_]->join();
$threads[$_]=threads->new(\&run,(\@objs));
$started++;
}
}
}
my $running=1;
while ($running>0) {
foreach (@threads) {
if (defined $_){
$_->join if ($_->is_joinable());
}
}
$running = scalar(threads->list(threads::running));
}
sub run($){
my $objs=shift;
print $_." " foreach (@{$objs});
# print $_->getData()." " foreach (@{$objs}); try to access data
print "\n";
}