#! perl -slw use strict; use threads qw[ yield ]; use threads::shared; use constant NUM_THREADS => 2; # <-- sub thread { my $tid = threads->tid; my $refSem = shift; while( 1 ) { warn( "$tid:locking sem\n" ); lock( $$refSem ); warn( "$tid:waiting sem\n" ); cond_wait( $$refSem ); print "$tid: got $$refSem"; warn( "$tid:yielding\n" ); yield; warn( "$tid:looping\n" ); } } my @workers; # <-- for (1..NUM_THREADS) { # <-- my $sem :shared; # <-- my $thread = threads->create( \&thread, \$sem ); # <-- push @workers, [ $thread, \$sem ]; # <-- } # <-- while( sleep 1 ) { my $value = int( rand 1000 ); my $thread = int rand( @workers ); # <-- my $refSem = $workers[$thread][1]; # <-- warn( "0:locking sem for thread $thread\n" ); lock( $$refSem ); warn( "0:Setting sem$thread to $value\n" ); $$refSem = $value; warn( "0:signalling sem$thread\n" ); cond_signal( $refSem ); warn( "0:Sleeping\n" ); }