You're loading
Thread::Queue but not using it. You can much simplify your thread-creation logic with it:
sub Create {
my ( $sourcePath, $destinationPath ) = @_;
# ... create directories and stuff ...
my $tq = Thread::Queue->new();
for (1..5) {
push @arrThreads, threads->create(
sub {
while (defined(my $item = $q->dequeue())) {
DoSomethingWithItem($item, $sourcePath, $destinati
+onPath);
}
}
);
}
while (my ($k, $v) = each(%hashFileList)) {
$tq->enqueue( $v );
}
$tq->end();
foreach (@arrThreads) {
my $num = $_->join;
}
}
The major change here is that it's passing the files one item at a time to the threads. You're dividing them to n buckets and passing the whole bucket to the thread at creation time.
Apart from being nicer to look at, this one-at-a-time (supervisor-worker) approach should ensure that the threads will finish quicker since they're given equal amounts of work.