use threads; use threads::shared; use Thread::Queue; my $a :shared; $a = 0; my $q = Thread::Queue->new(); sub set_positive { while (1) { lock $a; lock $q; if ($a == 0) { $a = int(rand() * 100); $q->enqueue($a); print "At set_positive: $a\n"; sleep(1); cond_broadcast($a); } else { cond_wait($a) } } } sub set_zero { while (1) { lock $a; lock $q; if ($a > 0) { $a = 0; $q->enqueue($a); print "At set_zero: $a\n"; sleep(1); cond_broadcast($a); } else { cond_wait($a) } } } sub printer { while (1) { lock $a; lock $q; my ($v_a, $v_b) = $q->dequeue(2); print "At printer $v_a $v_b ",$a, $/; sleep(1); } } my @threads = map threads->create($_), qw( set_positive set_zero printer); $_->join for @threads;