Wie greife ich auf Perl-Objekte in Threads zu?

Ich hoffe, jemand von euch kann mir bei meinem Problem helfen. Ich habe versucht, während einer Thread-Berechnung auf ein globales gemeinsames Array von Objekten zuzugreifen, und erhalte immer die Fehlermeldung "Verwendung eines nicht initialisierten Werts", obwohl ich deren Hashes drucken kann.

Außerdem kann ich meine Objekte nicht ändern, da ich mit seqio-Objekten von bioperl arbeite.

Das folgende Beispiel zeigt mein Problem.

Danke im Voraus.

Objektklasse:

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

Testklasse:

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage