in reply to Re^12: Threads sharing global variable (disingenous)
in thread Threads sharing global variable
1156646.pl | egrep "printer 0 0" ... At printer 0 0 59 At printer 0 0 0 At printer 0 0 0 At printer 0 0 0 At printer 0 0 0 At printer 0 0 54 At printer 0 0 0 At printer 0 0 0 At printer 0 0 0 At printer 0 0 0 At printer 0 0 88 At printer 0 0 0 At printer 0 0 74 ...
use threads; use threads::shared; use Thread::Queue; my $a :shared = 0; my $q = Thread::Queue->new(); sub set_positive { lock $a; while (1) { if ($a == 0) { $a = int(rand() * 100); $q->enqueue($a); # print "At set_positive: $a\n"; } else { cond_wait($a) } cond_broadcast($a); } } sub set_zero { lock $a; while (1) { if ($a > 0) { $a = 0; $q->enqueue($a); # print "At set_zero: $a\n"; } else { cond_wait($a) } cond_broadcast($a); } } sub printer { my ( $v_a, $v_b ); my $cnt = 100000; while ( 1 ) { ( $v_a, $v_b ) = $q->dequeue( 2 ); print "At printer $v_a $v_b ",$a, $/; # print "At printer $v_a $v_b\n"; exit unless --$cnt; } } threads->create( $_ ) for qw( set_positive set_zero printer ); $_->join() for threads->list;
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^14: Threads sharing global variable (disingenous)
by BrowserUk (Patriarch) on Mar 10, 2016 at 13:58 UTC | |
by Anonymous Monk on Mar 10, 2016 at 14:07 UTC | |
by BrowserUk (Patriarch) on Mar 10, 2016 at 14:40 UTC | |
by Anonymous Monk on Mar 10, 2016 at 18:56 UTC | |
by BrowserUk (Patriarch) on Mar 10, 2016 at 19:58 UTC | |
by Anonymous Monk on Mar 10, 2016 at 15:40 UTC | |
by Anonymous Monk on Mar 10, 2016 at 15:54 UTC | |
by Anonymous Monk on Mar 10, 2016 at 15:57 UTC | |
by BrowserUk (Patriarch) on Mar 10, 2016 at 16:02 UTC |