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