Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I've the following problem with shared and threads : I've
my %RESULTS : shared; .....
in the thread method I try to push a key with value - reference of array:
$RESULTS{"$ip"} = [];
but I get error :
Invalid value for shared scalar at jv.pl line 74.
Does someone knows where is the problem?
Is it forbidden to use references in shared hash?
Thanks in advance!

update (broquaint): added formatting
update deux (broquaint): title change (was Big problem! Urgently!)

Replies are listed 'Best First'.
Re: Problems with array references in shared hash values
by BrowserUk (Patriarch) on Jul 04, 2003 at 16:29 UTC

    It is possible to use references as values in a shared hash, but you have to also share the reference.

    use threads; use threads::shared; my %h : shared; $h{test} = []; Invalid value for shared scalar at (eval 4) line 1, <> line 4. my $ar = []; $h{test} = $ar; Invalid value for shared scalar at (eval 6) line 1, <> line 6. share $ar; $h{test} = $ar; ## No error this time.

    You could also do this as

    use threads; use threads::shared; my %h : shared; my $ar : shared = []; $h{test} = $ar;

    Or even

    use threads; use threads::shared; my %h : shared; my $ar = []; $h{test} = share( $ar );

    but the attempt to cut out the temporary variable and write

    use threads; use threads::shared; my %h : shared; $h{test} = share( [] ); Type of arg 1 to threads::shared::share must be one of [$@%] (not sing +le ref constructor) at (eval 6) line 1, near "] )"

    gives an error because of what the threads::shared pod terms "perl's prototyping problems" :)


    Examine what is said, not who speaks.
    "Efficiency is intelligent laziness." -David Dunham
    "When I'm working on a problem, I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong." -Richard Buckminster Fuller


Re: Problems with array references in shared hash values
by fglock (Vicar) on Jul 04, 2003 at 15:13 UTC

    I'm not sure about this, but instead of

    $RESULTS{ip} = $array_ptr

    try:

    $RESULTS{ip} = [ @$array_ptr ]

    This might be enough to make the array data "shareable" (not tested)

      but rigth there I want to creat the array. Before that the array doesn't exist!
        $RESULTS{ip} = []; push @{$RESULTS{ip}}, $new_data;
Re: Problems with array references in shared hash values
by jv (Initiate) on Jul 04, 2003 at 15:12 UTC
    $RESULTS{"$ip"} = \(); with this the mistake is the samo
Re: Problems with array references in shared hash values
by bobn (Chaplain) on Jul 04, 2003 at 15:43 UTC
    wouldn't this be easier with a small snippet of code demonstrating the problem (e.g. creating threads, etc.)?

    --Bob Niederman, http://bob-n.com
      my %RESULTS : shared; ..... foreach (1..$thread_number) { push @created_threads, threads->new(\&scan); } ...... sub scan { .... $RESULTS{"id"} = []; .... }