Почему я не вижу элементы в общей очереди из моего потока Perl? - PullRequest
1 голос
/ 16 февраля 2010

Я буду слушать порт (простой сервер), когда будет передан запрос, проанализировать URL и начать тему.

Поток вставит элемент в общую очередь и заблокирован во время вставки.

Я не могу получить элемент при вызове peek on queue.

use Thread qw(async); 
use Thread::Queue;

 my $DataQueue:shared = new Thread::Queue; 

 $newElement = init($user,$param,$reqest);  # init is method in ElementStructure.pm
 #after creating the element it is passes to subroutine where thread is started

sub updateData
{
    my $iElement=shift;

    $thr = async 
    { 

        {
            lock($DQueue);

            print "---->locked\n";
                    $DQueue->enqueue($iElement);
            insertdata();

        }

        print "lock released\n";

    };
}

sub insertdata
{
     my $count=0;
     while ($DataElement = $DQueue->peek($count) )
     {
    print "-- position $count\n";
    $count++;
     }
}

Ответы [ 2 ]

2 голосов
/ 16 февраля 2010

Возможно, проблема в том, что вы используете $ DataQueue в одном месте, а $ DQueue в другом месте? Убедитесь, что вы используете строгие и предупреждения.

Если $ iElement может быть ложным (например, 0), вам нужно будет сказать

while ( defined ( my $DataElement = $DQueue->peek($count) ) )

Исправляя имя переменной и вставляя некоторый код для вызова updateData, мне показалось, что все работает.

0 голосов
/ 17 февраля 2010

Вот ответ

use Thread qw(async); 
use Thread::Queue;

 my $DataQueue:shared = new Thread::Queue; 

 $newElement = init($user,$param,$reqest);  # init is method in ElementStructure.pm
 #after creating the element it is passes to subroutine where thread is started

 my $th=new Thread(\&updateData);
 $th->join();

sub updateData
{

        {
            lock($DQueue);

            print "---->locked\n";
                    $DQueue->enqueue($newElement);
            insertdata();

        }

        print "lock released\n";

}

sub insertdata
{
     my $count=0;
     while ($DataElement = $DQueue->peek($count) )
     {
    print "-- position $count\n";
    $count++;
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...