use threads; use threads::shared; use Thread::Queue; my $a :shared = 0; my $q = Thread::Queue->new(); sub set_positive { while (1) { lock $a; if ($a == 0) { $a = 1+int(rand() * 100); ## Modified 10/03/2016 15:57 in accordance with 1156654 & 1157305 $q->enqueue($a); print "At set_positive: $a\n"; } else { cond_wait($a) } cond_broadcast($a); } } sub set_zero { while (1) { lock $a; if ($a > 0) { $a = 0; $q->enqueue($a); print "At set_zero: $a\n"; } else { cond_wait($a) } cond_broadcast($a); } } sub printer { while (1) { my ($v_a, $v_b) = $q->dequeue(2); print "At printer $v_a $v_b ",$a, $/; } } my @threads = map threads->create($_), qw( set_positive set_zero printer); $_->join for @threads;