Multithreading 在Perl中将数组和哈希传递给多线程的子例程

Multithreading 在Perl中将数组和哈希传递给多线程的子例程,multithreading,perl,hash,Multithreading,Perl,Hash,问题是,我有一个数组和一个散列,我需要将其传递给在新线程中调用的子例程,如何做到这一点,因为在参数中传递的引用似乎不起作用 下面是一个示例代码段: while(1){ &funct1; foreach my $thr (threads->list(threads::joinable)){ print "joinable: $thr->tid()\n"; handle threads ...

问题是,我有一个数组和一个散列,我需要将其传递给在新线程中调用的子例程,如何做到这一点,因为在参数中传递的引用似乎不起作用

下面是一个示例代码段:

    while(1){
       &funct1;
       foreach my $thr (threads->list(threads::joinable)){
           print "joinable: $thr->tid()\n";
           handle threads ...
       }
    }

    sub funct1{
       @array= ... #create new array;
       %hash= ... #create new hash;          
       my $t=threads->create(\&funct2,\@array,\%hash);
    }

    sub funct2{
        ($arrayRef,$hashref)=@_;
        operate on @$arrayref;
        operate on %$hashref;
    }
在上面的代码段中,“funct2”没有获取引用,也没有创建散列或数组的单独副本。我试图将数组/哈希复制到funct2中的新数组/哈希,但没有成功!我不能使用shared,因为funct1在循环的每次迭代中都会创建新的哈希/数组


有什么建议吗?

您需要将散列和数组作为参数传递给函数func2

funct2(\@array,\%hash);

您需要将散列和数组作为参数传递给函数func2

funct2(\@array,\%hash);

您需要将散列和数组作为参数传递给函数func2

funct2(\@array,\%hash);

您需要将散列和数组作为参数传递给函数func2

funct2(\@array,\%hash);

在我的代码中发现了一个错误,但不知怎的错过了

无论如何,最好的方法是“使用线程::队列”。因此,修改后的代码片段如下所示

my $thrq = Thread::Queue->new();
while(1){
   &funct1;
   foreach my $thr (threads->list(threads::joinable)){
       print "joinable: $thr->tid()\n";
       handle threads ...
   }
}

sub funct1{
   @array= ... #create new array;
   %hash= ... #create new hash;
   $thrq->enqueue(\@array,\%hash);          
   my $t=threads->create(\&funct2);
}

sub funct2{
    ($arrayRef,$hashref)=$thrq->dequeue(2);
    operate on @$arrayref;
    operate on %$hashref;
}

在我的代码中发现了一个错误,但不知怎的错过了

无论如何,最好的方法是“使用线程::队列”。因此,修改后的代码片段如下所示

my $thrq = Thread::Queue->new();
while(1){
   &funct1;
   foreach my $thr (threads->list(threads::joinable)){
       print "joinable: $thr->tid()\n";
       handle threads ...
   }
}

sub funct1{
   @array= ... #create new array;
   %hash= ... #create new hash;
   $thrq->enqueue(\@array,\%hash);          
   my $t=threads->create(\&funct2);
}

sub funct2{
    ($arrayRef,$hashref)=$thrq->dequeue(2);
    operate on @$arrayref;
    operate on %$hashref;
}

在我的代码中发现了一个错误,但不知怎的错过了

无论如何,最好的方法是“使用线程::队列”。因此,修改后的代码片段如下所示

my $thrq = Thread::Queue->new();
while(1){
   &funct1;
   foreach my $thr (threads->list(threads::joinable)){
       print "joinable: $thr->tid()\n";
       handle threads ...
   }
}

sub funct1{
   @array= ... #create new array;
   %hash= ... #create new hash;
   $thrq->enqueue(\@array,\%hash);          
   my $t=threads->create(\&funct2);
}

sub funct2{
    ($arrayRef,$hashref)=$thrq->dequeue(2);
    operate on @$arrayref;
    operate on %$hashref;
}

在我的代码中发现了一个错误,但不知怎的错过了

无论如何,最好的方法是“使用线程::队列”。因此,修改后的代码片段如下所示

my $thrq = Thread::Queue->new();
while(1){
   &funct1;
   foreach my $thr (threads->list(threads::joinable)){
       print "joinable: $thr->tid()\n";
       handle threads ...
   }
}

sub funct1{
   @array= ... #create new array;
   %hash= ... #create new hash;
   $thrq->enqueue(\@array,\%hash);          
   my $t=threads->create(\&funct2);
}

sub funct2{
    ($arrayRef,$hashref)=$thrq->dequeue(2);
    operate on @$arrayref;
    operate on %$hashref;
}

是的,这也会起作用,我的代码片段也会起作用。我在传递ref时犯了一个愚蠢的错误。但最好的方法是使用线程队列。是的,这也会起作用,我的代码片段也会起作用。我在传递ref时犯了一个愚蠢的错误。但最好的方法是使用线程队列。是的,这也会起作用,我的代码片段也会起作用。我在传递ref时犯了一个愚蠢的错误。但最好的方法是使用线程队列。是的,这也会起作用,我的代码片段也会起作用。我在传递ref时犯了一个愚蠢的错误。但最好的方法是在每个perl脚本中使用thread queue.Include和。这是制作无缺陷程序所能做和应该做的第一件事。在每个perl脚本中包括和。这是制作无缺陷程序所能做和应该做的第一件事。在每个perl脚本中包括和。这是制作无缺陷程序所能做和应该做的第一件事。在每个perl脚本中包括和。这是制作无缺陷程序可以做和应该做的第一件事。