Perl: Threading mit geteiltem mehrdimensionalem Hash

8

Ich versuche, einen mehrdimensionalen Hash über mehrere Threads zu teilen. Dieser Hash enthält 2 verbundene Schlüsselpaare. Ich muss wissen, ob sie bereits verbunden sind, wenn nicht, muss ich sie verbinden, wenn nicht, muss ich nicht zur Datenbank gehen.

%Vor%

Ich bekomme immer den Fehler Invalid value for shared scalar in der Zeile
if(not defined $FLUobject2param{$objectID}{$paramID}){

Das hat offensichtlich mit Perls threads :: shared zu tun, die Ihnen nur erlauben, eine einzelne Ebene der gemeinsamen Struktur zu teilen.

Wie könnte ich immer noch überprüfen, ob diese Kombination bereits über mehrere Threads verwendet wird?

    
Pmarcoen 13.09.2010, 15:45
quelle

1 Antwort

8

Autovivification ist die meiste Zeit Ihr Freund, aber Sie müssen mit gemeinsamen Werten vorsichtig sein. Ändern Sie handlethread :

%Vor%

Dies ist eine dokumentierte Einschränkung :

  

Gemeinsame Variablen können nur Skalare, Referenzen von gemeinsamen Variablen oder Referenzen von geteilten Daten speichern ...

Der obige Code prüft die Hash-Keys einzeln, um eine Autovivi fi zierung zu vermeiden, die eine nicht gemeinsam genutzte leere Hash-Referenz in $FLUobject2param{$objectID} erstellt, falls sie noch nicht existiert.

Innerhalb der Bedingung bauen wir zuerst das entsprechende Gerüst und weisen dann den Wert zu. Auch hier geht die Autovivi fi zierung normalerweise für Sie vor, aber das Teilen zwingt uns dazu, bewusster zu sein.

    
Greg Bacon 13.09.2010, 17:13
quelle