Newsgroup: it.comp.lang.perl
Titolo: Condividere un oggetto tra più thread

Salve a tutti,
sto sviluppando un sistema nel quale diversi task sono demandati a 
thread differenti.
Ho la necessità di far lavorare diversi thread sullo stesso oggetto: 
essi dovrebbero cioè leggere e scrivere sulla struttura dati dell'oggetto.
Ho guardato la documentazione di threads::shared e il Wall terza 
edizione, ma nè l'uno nè l'altro dicono nulla a riguardo della 
condivisione di oggetti tra thread.
Nella documentazione di threads::shared ho trovato il seguente:
BUGS
"bless" is not supported on shared references. In the current version,
"bless" will only bless the thread local reference and the blessing
will not propagate to the other threads. This is expected to be imple‐
mented in a future version of Perl.
Questo significa, come credo, che NON è possibile condividere oggetti 
tra thread ??
Allego un codice esemplificativo di quello che vorrei fare. Nell'esempio 
provo a condividere tra i due thread l'oggetto $myJob ma non so quale 
sintassi utilizzare e non arrivo a nessun risultato.
Grazie dell'attenzione
use threads;
use threads::shared;
package prova;
sub go {
         $jobRif = shift();
         print "THREAD: l'oggetto passato è ".$jobRif."\n";
         print "THREAD: l'id è ".$jobRif->{id}."\n";
         $jobRif->{id} = 10;
         print "THREAD: ho modificato l'id e ora vale ".$jobRif->{id}."\n";
}
package job;
use threads::shared;
sub new {
         my $class = shift;
         my $this = {};
         share($this);
         my $x = 0;
         $this->{id} = &share(\$x);
         bless $this, $class;
         return $this;
}
package main;
my $myJob = new job;
# QUALE SINTASSI UTILIZZARE PER CONDIVIDERE L'OGGETTO myJob ??
# $myJob = &share([]);
# $hash{myJob} = &share({});
print "MAIN  : l'oggetto è $myJob\n";
print "MAIN  : l'id iniziale del job è $myJob->{id}\n";
$t = new threads ( sub { prova->go (\$myJob); } )->join;
print "MAIN  : l'id finale del job è $myJob->{id}\n";

essi dovrebbero cioè leggere e scrivere sulla struttura dati dell'oggetto.
Non so se può essere una via d'uscita ma hai considerato l'idea di
usare Storable?
Ho da poco avuto la necessità di rendere degli oggetti 'persistenti'
tra un'applicazione e l'altra...
Non è una soluzione con i thread, ma forse può essere un workaround
ps: un ciao a tutti, è da un po che non intervengo, ma vi leggo sempre
:)
--
pigmalion at home
http://www.pigmalion.info/




 tra thread ??
Sì, ho fatto alcune prove e mi sento di dire che non si può fare.
Tra l'altro, se provo a fare:
  my $obj : shared;
  $obj=Coso->new();
Ottengo un warning: "Invalid value for shared scalar".
Mi sa che gli oggetti non si condividono...
Forse si può fare qualcosa con oggetti inside-out, condividendo gli
hash che tengono gli attributi, passando at thread l'identificatore
dell'oggetto, e creando in ciascun thread un oggetto front-end che
delega tutto alla classe inside-out... se serve ci posso provare.
-- 
  dakkar

Oggi mi è stato fatto conoscere il modulo Object::InsideOut, che
supporta la condivisione di oggetti tra thread. Non l'ho ancora
studiato abbastanza da consigliarne l'uso senza riserve, ma se gli
oggetti da condividere non ereditano da classi esistenti, può essere
una buona soluzione.
Il problema grosso (e purtroppo non risolvibile) di Object::InsideOut
è che tutte le classi nella rete di ereditarietà devono usare
Object::InsideOut...
-- 
  dakkar

 ha scritto nel messaggio
news:pTWif.24944$tc5....@tornado.fastwebnet.it...



Ciao, ti ringrazio per la risposta.
Sto guardando il modulo che mi hai indicato.
Sembra interessante.
Farò delle prove, al caso ti chiederò aiuto !!
Ciao