Schrift
[thread]8767[/thread]

Sharing einer hash reference bei Threads



<< >> 3 Einträge, 1 Seite
weismat
 2007-02-19 19:59
#74398 #74398
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Ich versuche vergeblich bei Threads eine Hash Reference als Element eines Array zu sharen.
Anbei findet Ihr den Code der Klasse die das Lesen vom Socket und das Parsen einer Message über einen Pool realisieren soll. Der Code dieser Klasse sieht wie folgt aus:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use threads;
use threads::shared;
use Thread::Queue;
my $toBeSentMessages = Thread::Queue->new;#the queue with the messages which are supposed to be sent
my @receivedMessages : shared;##the queue with the messages which are received
my $result : shared;

sub new{
my ($proto, $userSuffix, $noOfThreads, $host, $port ) = @_;
my $class = ref($proto) || $proto;
for my $i(1..$noOfThreads) {
threads->create("opThread", "$userSuffix$i", $host, $port);
}
my $self = {};
bless ($self, $class);
return $self;

}

sub send{
my ($self, $message)=@_;
$ToSentMessages->enqueue($message);
}

sub receive{
lock (@receivedMessages);
cond_wait(@receivedMessages);
return (pop(@receivedMessages));
}

sub opThread {
my ($user, $host, $port)=@_;
my $socket=deapi->new($user, $user, $host, $port);
print "Start of Child\n";
while () {
print "Inside While\n";
sleep(1);
my $message=$ToSentMessages->dequeue_nb();
if (defined($message)) {
print "Sending Message $message\n";
$api->send($message);
}
if ($api->can_read()) {
print "Receiving OP Message\n";
$result =(deapi::parse($api->receive()));
lock (@ReceivedMessages);
push(@ReceivedMessages, $result);
cond_signal(@ReceivedMessages);
}
}
}

Ich habe zwar ein paar mal ähnliche Beiträge gefunden, aber die haben mir leider nicht bei der Lösung geholfen.

Danke!\n\n

<!--EDIT|weismat|1171909406-->
weismat
 2007-02-20 16:02
#74399 #74399
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Mittlerweile habe ich verstanden, was ich machen muss...
Shared markiert nur die erste Ebene als Shared, alle Ebenen darunter
Ich muss den ganzen Knoten durchgehen, Data::Dumper nehmen oder etwas mit Split machen...
weismat
 2007-03-23 17:10
#74400 #74400
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Thread::Queue::Any ist ein Modul, daß Objekte serialisiert und dann auf eine thread-sichere Queue schiebt....Immer noch nicht schön....
<< >> 3 Einträge, 1 Seite



View all threads created 2007-02-19 19:59.