sub helper { my $href = shift; $href->{NEW_KEY}=1; } #### sub my_sub { $hohref = shift; # create thread pool my $pool = Thread::Pool::Simple->new( do => [ \&helper ] ); # submit jobs foreach my $hashref ( values %{$hohref} ) { $pool->add( $hashref ); } # wait for all threads to end $pool->join(); } #### foreach my $hashref ( values %{$hohref} ) { helper( $hashref ); } #### use strict; use warnings; use threads; use threads::shared; use Thread::Pool::Simple; use 5.010; use Data::Dumper; sub helper { say "helper starts"; my $href = shift; say "href is $href"; $href->{NEW_KEY} = 1; say "helper ends with $href"; } sub my_sub { my $hohref = shift; my $shared_hohref = shared_clone $hohref; my $pool = Thread::Pool::Simple->new( do => [\&helper] ); # submit jobs foreach my $hashref ( values %{$shared_hohref} ) { say "adding to pool: $hashref"; $pool->add($hashref); } # wait for all threads to end $pool->join(); return $shared_hohref; } my $hoh = { A => { NAME => "a" }, B => { NAME => "bb" } }; say "1\t", Dumper $hoh; my $updated_hoh = my_sub($hoh); say "2\t", Dumper $updated_hoh;