use threads;
use Thread::Queue;
my $q=Thread::Queue->new();
#queue size is infinite, enqueue never blocks
for (my $i=0; $i<10; $i++) {
$q->enqueue("item $i");
}
$q->enqueue(undef);
$q->enqueue(undef);
my $consumer1=threads->create(\&consume);
my $consumer2=threads->create(\&consume);
$consumer1->join();
$consumer2->join();
print "done\n";
sub consume {
my $tid=threads->tid();
my $val;
while($val=$q->dequeue()) { #dequeue call blocks if the queue is emptry
print "$tid val=$val\n";
sleep(rand);
}
}