|
|
|
Forum Member
      
участник
Last Login: 20.01.2007 9:18
Сообщ.: 31,
Visits: 319
|
|
Hi guys, can anyone help me ?
#I try to put in queue my record
use threads;
use Thread::Queue;
use Data::Dumper;
my $queue = new Thread::Queue;
$msg{'1'} = "Hello ";
$msg{'2'}= "Word ";
$queue->enqueue(\%msg);
$r = $queue->dequeue_nb;
print "r = $r";
print "1 : ".$r->{'1'};
print "2: ".$r->{'2'};
But I get error : Invalid value for shared scalar at c:\perl\lib\Queue.pm 90.
When I remove use threads; code works OK.
Any ideas how to put record in right way?
But I need "use threads;" because without it my queue not sharing
between threads.
Following example illustrate what I mean
#test for sharing queue between threads
use threads;
use Thread::Queue;
use Data::Dumper;
use Thread;
my $queue = new Thread::Queue;
sub th1 {
while(1) {
$queue->enqueue("msg from th1");
print "th1: ADDED ".$queue->pending."";
sleep 2;
}
}
sub th2 {
while(1) {
print "th2: REMOVED ".$queue->pending."";
$queue->dequeue_nb;
sleep 2;
}
}
$th1 = new Thread(\&th1);
$th2 = new Thread(\&th2);
$th1->join;
$th2->join;
Code works OK. queue shared between threads.
when I comment "use threads;" and run code, I can see that queue not
shared between threads. Every thread have separated queue.
How to solve it ?
Thanks.
|
|
|
|
|
новичок
      
участник
Last Login: 02.08.2005 16:10
Сообщ.: 6,
Visits: 67
|
|
Tread::Queue не передает ссылок, только обычные типы(скаляры, списки, хэши). Вот это работает:
use threads;
use Thread::Queue;
#use Data::Dumper;
my $queue = new Thread::Queue;
$msg{'1'} = "Hello ";
$msg{'2'}= "Word ";
$queue->enqueue(%msg);
my @gotit;
while ($queue->pending) {
push @gotit, $queue->dequeue_nb;
}
my %gotit = @gotit;
print "gotit = @gotit";
print "1 : ".$gotit{'1'};
print "2: ".$gotit{'2'};
|
|
|
|
|
Forum Member
      
участник
Last Login: 20.01.2007 9:18
Сообщ.: 31,
Visits: 319
|
|
Thx for answer!
Solved by using Thread::Queue:Any, which accept any stuructures ...
|
|
|
|