in reply to Re: Not geting Shared variable of parent process into the thread
in thread Not geting Shared variable of parent process into the thread

Thanks for the reply..
code example i gave was just a concept what i am trying to get actually.
finally i was able to get the values in Plugin execute method.but i have another problem.
I created a shared hash that have some scaler values and also holds the reference of other hash into it. when i m passing it. its gives me errro "Invalid value for shared scalar at....."
please help me how i can access a shared hash that have reference of another hash. Thanks.
  • Comment on Re^2: Not geting Shared variable of parent process into the thread

Replies are listed 'Best First'.
Re^3: Not geting Shared variable of parent process into the thread
by avanta (Beadle) on Jun 25, 2010 at 09:56 UTC

    Here is the code where i am not getting the value of %hsh{innser_hash} into the execute method.

    use strict;
    use warnings;
    use threads;
    use threads::shared;
    use APP::Plugin;
    use Data::Dumper;
    my %hsh : shared = ( 'a' => 1 );
    my %transaction_hash;
    %{$hsh{inner_hash}} = %transaction_hash;
    my $thread = threads->create( \&subrt, %hsh );
    $thread->join();
    sub subrt { my %args = @_; print
    APP::Plugin->execute(%hsh); }

    #Code for Plugin module package APP::Plugin;
    use strict;
    use warnings;

    sub execute {

    my $class = shift();
    my %abc = @_;
    my %record_hash=%{$abc{inner_hash}};

    foreach (keys %abc)
    {
    print $_. "---" . $abc{$_}."\n";
    }
    }

    1;

    value of %record hash is undefined and also giving error of Invalid value for shared scalar. Help required.

      first of all variables that will be shared between threads needs to be shared so hash transaction_hash needs to be declared as well as shared. Second you need to pass the %transaction hash as a reference into %hsh with the \ prefix. Look at the following code

      #!/usr/bin/perl -w use strict; use warnings; use threads; use threads::shared; use Data::Dumper; my %hsh : shared; my %transaction_hash :shared = ( 'another_k' => 'another_v'); $hsh{inner_hash} = \%transaction_hash; # referencing my $thread = threads->create( \&subrt, %hsh ); $thread->join(); sub subrt { my %args = @_; print Plugin->execute(%hsh); } #Code for Plugin module package Plugin; sub execute { my $class = shift(); my %abc = @_; my %shsh = %{$abc{inner_hash}}; #dereferencing foreach (keys %shsh) { print $_. "---" . $shsh{$_}."\n"; } }