8

我正在尝试在多个线程上共享多维散列。这个哈希包含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;
    }
}

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

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

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

4

1 回答 1

8

Autovivification 在大多数情况下是你的朋友,但你必须小心它的共同价值观。修改handlethread

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

这是由于做一个记录的限制

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

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

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

于 2010-09-13T17:13:58.737 回答