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


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.
  • Comment on Re^3: Not geting Shared variable of parent process into the thread

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

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