use threads; use threads::shared; my %CallInfoHash : shared = (); my $processToFork = 5; my $threads = 100; my %threadsHash; for ($jj = 0; $jj < $processToFork; $jj++) { ...fork a process here: for ($ii = 0; $ii < $threads; $jj++) { my $callNum = $jj; $UrlToDownload = ; push (@argList, $callNum ); push (@argList, $UrlToDownload); $threadsHash{$CallNumber} = threads->create(\&tsub, @argList); } } sub tsub { .. Here some operations are done and values are generated. These values are to be stored in %CallInfoHash Hash. my $value1 = xx; my $value2 = xx; $CallInfoHash{$CallNumber}{'value1'} = $value1; $CallInfoHash{$CallNumber}{'value2'} = $value2; .... There are about 10 values. }