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

Is this running at all for you? because I've identified a bunch of syntax errors, you might want to use use strict; and use warnings; in your code that will help you diagnosing and understanding

Here is what I've found:

If this is your first experience with Perl, I'd recommend you to start from basic stuff, since when you working with threads there is a high probability things screw up and you don't know where, bottom line is "..you have to learn to crawl before you learn to walk ..." (Aerosmith)

Usefull links:

  • Object oriented tutorial
  • Use strict and warnings
  • keys function

  • Finally here is your code corrected

    use strict; use warnings; use threads; use threads::shared; use APP::Plugin; use Data::Dumper; my %hsh : shared = ( 'a' => 1 ); 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 = @_; foreach (keys %abc) { print $_. "---" . $abc{$_}."\n"; } } 1;

    Replies are listed 'Best First'.
    Re^2: Not geting Shared variable of parent process into the thread
    by avanta (Beadle) on Jun 25, 2010 at 07:11 UTC
      Thanks for the reply..
      code example i gave was just a concept what i am trying to get actually.
      finalli 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.
    Re^2: Not geting Shared variable of parent process into the thread
    by avanta (Beadle) on Jun 25, 2010 at 07:11 UTC
      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.

        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"; } }