thread queue shared variable problem, URGENT.
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



thread queue shared variable problem, URGENT.... Expand / Collapse
Автор
Сообщение
21.07.2005 15:32
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum 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.
Сообщ. #876219
22.07.2005 18:23
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
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'};
Сообщ. #876322
23.07.2005 3:14
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 20.01.2007 9:18
Сообщ.: 31, Visits: 319
Thx for answer!
Solved by using Thread::Queue:Any, which accept any stuructures ...
Сообщ. #876356
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 8:35