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 に答える