【问题标题】:Perl: Threading with shared multi-dimensional hashPerl:共享多维哈希的线程
【发布时间】:2011-04-11 17:58:50
【问题描述】:

我正在尝试在多个线程上共享多维散列。 这个hash包含2个连接的key-pairs,我需要知道它们是否已经连接,如果没有,我需要连接它们,如果没有,不需要去数据库。

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

我不断收到错误 Invalid value for shared scalar 在线
if(not defined $FLUobject2param{$objectID}{$paramID}){

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

我如何才能检查此组合是否已用于多个线程?

【问题讨论】:

    标签: multithreading perl hash share multidimensional-array


    【解决方案1】:

    在大多数情况下,Autovivification 是您的朋友,但您必须谨慎对待它,因为您有共同的价值观。修改handlethread

    sub handlethread{
      # ...
      unless (exists $FLUobject2param{$objectID} &&
              exists $FLUobject2param{$objectID}{$paramID})
      {
          $dbh->getObject2Param($objectID,$paramID);
          $FLUobject2param{$objectID} = &share({});
          $FLUobject2param{$objectID}{$paramID} = 1;
      }
    }
    

    这是由于documented limitation

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

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

    在条件内部,我们首先构建合适的脚手架,然后赋值。同样,自动激活通常会为您处理这个问题,但分享会迫使我们更加慎重。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      相关资源
      最近更新 更多