Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6850[/thread]

Threads und shared Data: Referenzen auf ein Objekt sharen



<< >> 6 Einträge, 1 Seite
drsoran
 2005-04-05 16:36
#53326 #53326
User since
2005-04-05
2 Artikel
BenutzerIn
[default_avatar]
Hallo!

Ich habe folgendes Programm:

/// Server.pl ////
Code: (dl )
1
2
3
4
5
#! perl -w
use strict;
use ServerController;

my $sc = ServerController->new(); #Referenz auf Objekt


/// ServerController.pm ///
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package ServerController;

use strict;
use IO::Socket;
use threads;
use threads::shared

sub new
{
   my $proto = shift;
   my $class = ref($proto) || $proto;
   my $self  = {};
   bless ($self, $class);
   $self->{LISTENSOCKET} = IO::Socket::INET->new(...);
   $self->{CLIENTS} = [];
   $self->{THREAD} = threads->new("listen", $self);
   return $self;
}

sub listen{
   my $self = shift;
   while(1){
         my $client = $self->{LISTENSOCKET}->accept();
         push @{$self->{CLIENTS}}, $client;
   }
}

1;

// ENDE ServerController.pm //

PROBLEM: Wenn ich den Thread in ServerController.pm erzeuge bekommt er als Parameter eine Referenz auf die Instanz von ServerController. Aber da die Daten in Threads ja private sind erzeugt der Thread seinen eigenen ServerController und die neuen Clients kommen in dessen Array.

Wenn ich jetzt die Clients aus der Server.pl benutzen möchte sind keine vorhanden, da die Referenz auf die erste Instanz von ServerController zeigt.

Kann ich $self im Konstruktor von ServerController sharen, so dass der Thread mit der alten Referenz arbeitet?

Hat bei mir nicht geklappt. Wie kann man im allgemeinen Refrenzen sharen?


edit renee: [code]-Tags eingefügt\n\n

<!--EDIT|renee|1112704746-->
sesth
 2005-04-05 17:21
#53327 #53327
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Hast Du es schon mit
Code: (dl )
use threads::shared;

probiert?
Gruß
Thomas
Crian
 2005-04-05 17:34
#53328 #53328
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Steht doch im ServerController drin =)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
sesth
 2005-04-05 19:02
#53329 #53329
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Sorry, hab ich übersehen - es wird aber nicht benutzt. Es sollte dann
Code: (dl )
my $self : shared  = {};

heißen.
Gruß
Thomas
drsoran
 2005-04-05 21:37
#53330 #53330
User since
2005-04-05
2 Artikel
BenutzerIn
[default_avatar]
Hab ich auch schon probiert. Aber wenn dann müsste es doch
$self = &shared({});

heissen oder? (perldoc->share->bugs)

Aber ich glaube gelesen zu haben, dass man referenzen auf ge-blesste Hashes, also Objekte "noch nicht" sharen kann oder?
sesth
 2005-04-06 18:09
#53331 #53331
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Stimmt:

Quote
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 implemented in a future version of Perl.


Dazu fällt mir dann auch nichts mehr ein, außer auf den OO-Ansatz zu verzichten.
Gruß
Thomas
<< >> 6 Einträge, 1 Seite



View all threads created 2005-04-05 16:36.