use strict; use warnings; use 5.010; use threads; use threads::shared; use Thread::Queue; my $q : shared; $q = Thread::Queue->new; #a Queue is thread safe, which means #threads can read from it without #interfering with each other. my @files = ( 'file1', 'file2', 'file3', 'file4', 'file5', ); my $thread_count = 2; my @threads; for (1 .. $thread_count) { my $thread_name = "thread$_"; push @threads, threads->create(\&do_stuff, $thread_name); } $q->enqueue(@files); #...and the starting gun sounds! for (1 .. $thread_count) { $q->enqueue("END_OF_QUEUE"); } for my $thr (@threads) { $thr->join(); } sub do_stuff { my $thr_name = shift; while ( (my $file = $q->dequeue) ne "END_OF_QUEUE" ) { #$q->dequeue() blocks until there is something to retrieve #from the queue. say "$thr_name is opening file: $file"; #doing some work: sleep int(rand 4); say "$thr_name is is done with: $file"; } } --output:-- thread1 is opening file: file1 thread2 is opening file: file2 thread2 is is done with: file2 thread2 is opening file: file3 thread1 is is done with: file1 thread1 is opening file: file4 thread2 is is done with: file3 thread2 is opening file: file5 thread2 is is done with: file5 thread1 is is done with: file4