use strict; use warnings; use threads; use Thread::Queue; my $workQueue = Thread::Queue->new(); my $doneQueue = Thread::Queue->new(); my @threads; push @threads, threads->create(sub{DoWork($workQueue, $doneQueue)}) for 1 .. 4; for (1 .. 10000) { my $work = int(rand(10000)); $workQueue->enqueue($work); } $workQueue->end(); $_->join() for @threads; print "$_\n" while $doneQueue->pending() && ($_ = $doneQueue->dequeue()); exit; sub DoWork { my ($work, $done) = @_; while (my $item = $work->dequeue()) { $done->enqueue($item) if $item >= 10 && $item <= 20; } } #### 17 14 11 19 12 10 13 10 11