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; #### C:\test>1156640 At set_positive: 11 At set_zero: 0 At set_positive: 98 At set_zero: 0 At set_positive: 2 At set_zero: 0 At printer 11 0 0 At printer 98 0 94 At printer 2 0 94 At set_positive: 94 At set_zero: 0 At set_positive: 61 At printer 94 0 0 At set_zero: 0 At printer 61 0 0 At set_positive: 13 At set_zero: 0 At printer 13 0 0 At set_positive: 13 At set_zero: 0 At printer 13 0 0 At set_positive: 28 At set_zero: 0 At printer 28 0 0 At set_positive: 18 At set_zero: 0 At printer 18 0 0 At set_positive: 59 At set_zero: 0 At printer 59 0 0 At set_positive: 15 At set_zero: 0 At printer 15 0 0 At set_positive: 31 At set_zero: 0 At set_positive: 22 At printer 31 0 0 At printer 22 0 0 At set_zero: 0 At set_positive: 19 At set_zero: 0 At printer 19 0 0 At set_positive: 2 At set_zero: 0 At printer 2 0 0 At set_positive: 22 At set_zero: 0