example When only thr1 was enabled thr2 was commented out:
tstsrv:/home/aaron # ./collect_files_threaded.pl -u aaron | wc -l 3948 When only thr2 was enabled thr1 was commented out: tstsrv:/home/aaron # ./collect_files_threaded.pl -u aaron | wc -l 1436 When both were enabled (below code): tstsrv:/home/aaron # ./collect_files_threaded.pl -u aaron | wc -l 1753 Each thread updates a global variable. I got the code generated by find2perl command to create the function findFiles. #### use File::Find; use threads; use threads::shared; my $user :shared = $cargs{u}; my $uidNum :shared = getpwnam($user); my $user_file :shared = "/var/tmp/test_$user.file.list"; my @array_to_write :shared; my $thr1 = threads->create(\&find, \&findFiles, "/var/tmp"); my $thr2 = threads->create(\&find, \&findFiles, "/tmp"); $thr1->join(); $thr2->join(); print "Saving the details to $user_file\n"; saveFile($user_file,@array_to_write); exit; sub findFiles { my ($dev,$ino,$mode,$nlink,$uid,$gid,$file,$fstype); $file=$File::Find::name; lock(@array_to_write); (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($file)) && !($File::Find::prune |= ($dev != $File::Find::topdev)) && ($uid == "$uidNum") && push (@array_to_write,"$file:$uidNum:$gid:$mode:$fstype"); } sub saveFile{ my($file,@data)=@_; open(F,">$file") or die("Error:Failed to open $file for write:$!\n"); print F (join("\n",@data) . "\n"); close(F); } #### foreach my $mnt (@mounts) { $script="file_collections.pl -u $user -m $mnt"; my $pid = fork; if (not defined $pid) { die 'Could not fork child'; next; } if ($pid) { $forks++; Log ("Parent process PID ($$) starting Child pid: $pid for $mnt. \nNum of forked child processes: $forks\n"); } else { Log ("child PID ($$) --> executing \'$script\' \n"); exec ("$scr_loc/$script"); exit; } } for (my $i = 0; $i < $forks; $i++){ my $pid = wait(); Log ("$0 : $pid Completed\n"); } file_collections.pl Log ("Start Time \t\t: $datestring \n\n"); Log ("Finding the files for $user with uid $uidNum on $mount\n"); $path=$mount; $path=~s/\//_/g; $user_file = "$log_dir/$user$path.list"; $user_log_file = "$log_dir/$user$path.log"; find(\&findFiles, "$mount"); $datestring = getDateTime(); Log ("Total number of files parsed on $mount = $count\n"); Log ("Saving the details to $user_file\n\n"); Log ("End Time \t\t: $datestring\n"); saveFile($user_file,@array_to_write); saveFile($user_log_file,@log); sub findFiles { my ($dev,$ino,$mode,$nlink,$uid,$gid,$file,$fstype); $file=$File::Find::name; $fstype=findFstype("$file"); $count++; (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($file)) && !($File::Find::prune |= ($dev != $File::Find::topdev)) && ($uid == "$uidNum") && push (@array_to_write,"$file:$uidNum:$gid:$mode:$fstype"); }