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

Hello, I am using perlthrtut module for perl thread, I have a problem while accessing shared variable that i defined before creating threads.
I created shared hash with use threads:shared. and then created a thread and called a subroutine for that thread. into that subroutine i am calling another perl module. i need to accces this shared hash into the perl module i m calling from subroutine. I could get the thread Id there but could not geting values that i shared or value that i am passing as a parameter list with thread->create(\&sub , %hash).
Here is code.
use threads;
use threads::shared;
use APP::plugin;
%hsh :shared;
thread->create(\&subrt, %hsh);
sub subrt{
my %args =@_;
plugin->execute(%hsh);
}


Code for Plugin module
package plugin;
execute{
my %abc =@_;
my %shsh = %hsh; foreach $keys (%abc){ print $keys."---".$abc{$keys};}
}
I am not geting any paramter value i passed or even if i tried to access the shared hash that is also not avaialable in execute.
  • Comment on Not geting Shared variable of parent process into the thread

Replies are listed 'Best First'.
Re: Not geting Shared variable of parent process into the thread
by bluescreen (Friar) on Jun 24, 2010 at 13:32 UTC

    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:

    • You have use APP::plugin where in package's definition you are not using the "APP::" namspace, also code references point to plugin
    • Doing plugin->execute(...) will call execute method with "plugin" as the first parameter so fist line of execute subroutine should be  my $class = shift;
    • You missed word "sub" before execute
    • When using threads you have to join them otherwise the program will NOT wait till the thread finishes execution
    • You don't have anything on the shared hash so nothing will be printed unless you fill it with something like  my %hsh :shared = ('mykey' => 'myvalue');
    • Seems like you want to iterate over the hash's keys but you are iterating over both keys and values at same time, so you might want to change the foreach to foreach my $keys ( keys %abc)
    • Your packages misses to provide a true value when loaded so you might want to add 1; as the last line of plugin package

    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;
      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.
      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.
Re: Urgent ::Not geting Shared variable of parent process into the thread
by Anonymous Monk on Jun 24, 2010 at 06:27 UTC
    Urgent, emergency, urgent urgent urgent, emergency...:D