1

传递请求时,我将在端口(简单服务器)上侦听解析 URL 并启动线程。

线程将在共享队列中插入一个元素,并在插入时锁定。

当我在队列上调用 peek 时,我无法获取元素。

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++;
     }
}
4

2 回答 2

2

也许问题是您在一个地方使用 $DataQueue 而在其他地方使用 $DQueue?确保您使用的是严格和警告。

如果 $iElement 可能是假的(例如 0),你需要说

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

更正变量名并输入一些代码来调用 updateData,一切似乎都对我有用。

于 2010-02-16T06:52:11.863 回答
0

这是答案

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++;
     }
}
于 2010-02-17T05:35:22.483 回答