#! perl -slw use strict; use threads qw[ yield ]; use threads::shared; 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" ); } } our $T ||= 2; my @sems :shared = 0 .. $T; my @threads = map{ threads->create( \&thread, \$sems[ $_ ] ); } 1 .. $T; while( sleep 1 ) { my $value = int( rand 1000 ); my $thread = 1 + int rand( 2 ); my $refSem = \$sems[ $thread ]; 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" ); } __END__ C:\test>t-cond-2.pl 1:locking sem Thread 1 terminated abnormally: lock can only be used on shared values at C:\test\t-cond-2.pl line 11. 2:locking sem Thread 2 terminated abnormally: lock can only be used on shared values at C:\test\t-cond-2.pl line 11. 0:locking sem for thread 1 lock can only be used on shared values at C:\test\t-cond-2.pl line 34. Perl exited with active threads: 0 running and unjoined 2 finished and unjoined 0 running and detached