use strict; use warnings; # Use module thread use threads ('yield','stack_size' => 64*4096,'exit' => 'threads_only','stringify'); # Use Share use threads::shared; # Declare shared array of Files Names my @FilesList : shared = (); &RunThreads(); &PrintFilesNames(); ################################################################################### # SubRoutines sub RunThreads() { # Running thread List my @findFilesThreads; # Create Threads my $dirName = "Directory1"; my @filesList = ("file11","file12","file13"); # Launch thread with its argument my $thr = threads->create('ThreadFunc',($dirName,@filesList )); push(@findFilesThreads,$thr); $dirName = "Directory2"; @filesList = ("file21","file22","file23"); # Launch thread with its argument $thr = threads->create('ThreadFunc',($dirName,@filesList )); push(@findFilesThreads,$thr); $dirName = "Directory3"; @filesList = ("file31","file32","file33"); # Launch thread with its argument $thr = threads->create('ThreadFunc',($dirName,@filesList )); push(@findFilesThreads,$thr); # Wait threads to finish foreach (@findFilesThreads) { my $thread = $_; if (defined($thread)) { if ($thread->is_running()) { $thread->join(); } else { $thread->detach() } } } } # The Thread subroutin sub ThreadFunc() { my ($dirName,@filesName) = @_; # Random sleep, So its time the Thread print order will be different sleep rand(5); print "Add Directory : $dirName\n"; # Create shread list entries my %entry : shared; my $dir : shared; my @files : shared; $entry{directory} = \$dir; $entry{files} = \@files; # Fill the data $entry{directory} = $dirName; foreach (@filesName) { push(@{$entry{files}},$_); } # lock the shared array lock(@FilesList); push(@FilesList,\%entry); return; } sub PrintFilesNames() { print "Directory Tree : \n"; lock(@FilesList); foreach (@FilesList) { my %entry = %{$_}; print " Directory name is : $entry{directory}\n"; print " Files are : \n"; foreach (@{$entry{files}}) { print " $_\n"; } } }The output of this script will look like (The directories order may change according to the sleep interval):
Add Directory : Directory1
Add Directory : Directory3
Add Directory : Directory2
Directory Tree :
Directory name is : Directory1
Files are :
file11
file12
file13
Directory name is : Directory3
Files are :
file31
file32
file33
Directory name is : Directory2
Files are :
file21
file22
file23