Multithreading Perl:使用共享多维散列的线程

Multithreading Perl:使用共享多维散列的线程,multithreading,perl,hash,share,multidimensional-array,Multithreading,Perl,Hash,Share,Multidimensional Array,我试图在多个线程上共享多维哈希。 这个散列包含2个连接的密钥对,我需要知道它们是否已经连接,如果没有,我需要连接它们,如果没有,就不需要访问数据库 use threads; use threads::shared; my %FLUobject2param : shared = (); #Start a new thread for every available processor for (my $i=0;$i<$PROCESSORS;$i++) { threads-&

我试图在多个线程上共享多维哈希。 这个散列包含2个连接的密钥对,我需要知道它们是否已经连接,如果没有,我需要连接它们,如果没有,就不需要访问数据库

use threads;
use threads::shared;

my %FLUobject2param : shared    = ();

#Start a new thread for every available processor
for (my $i=0;$i<$PROCESSORS;$i++) {
    threads->new(\&handlethread);
}
#Catch if these threads end
foreach my $onthr (threads->list()) {
    $onthr->join();
}

sub handlethread{
    ...
    if(not defined $FLUobject2param{$objectID}{$paramID}){
        $dbh->getObject2Param($objectID,$paramID);
        $FLUobject2param{$objectID}{$paramID} = 1;
    }
}
使用线程;
使用线程::共享;
我的%FLUobject2param:shared=();
#为每个可用处理器启动一个新线程
对于(my$i=0;$inew(\&HandletThread);
}
#如果这些线程结束,则捕获
foreach my$onhr(线程->列表()){
$onhr->join();
}
副手螺纹{
...
if(未定义$FLUobject2param{$objectID}{$paramID}){
$dbh->getObject2Param($objectID,$paramID);
$FLUobject2param{$objectID}{$paramID}=1;
}
}
我一直在获取行中共享标量的错误
无效值
if(未定义$FLUobject2param{$objectID}{$paramID}){

这显然与perl的threads::shared有关,它只允许您共享单个级别的共享结构


我如何仍然能够检查此组合是否已在多个线程上使用?

Autovivification在大多数情况下都是您的朋友,但您必须小心使用共享值。修改
HandletThread

sub handlethread{
  # ...
  unless (exists $FLUobject2param{$objectID} &&
          exists $FLUobject2param{$objectID}{$paramID})
  {
      $dbh->getObject2Param($objectID,$paramID);
      $FLUobject2param{$objectID} = &share({});
      $FLUobject2param{$objectID}{$paramID} = 1;
  }
}
这是应该做的一件事:

共享变量只能存储标量、共享变量的引用或共享数据的引用

上面的代码分别检查散列键以避免自动激活,这将在
$FLUobject2param{$objectID}
中植入一个未共享的空散列引用(如果它还不存在)

在条件内,我们首先构建适当的脚手架,然后分配值。同样,自动生命通常为您处理此问题,但共享迫使我们更加谨慎