Tested. Works. Changed lines are marked.
#! 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" ); }
I stored $thread in the array it was being stored saved in the original too. It's not being used by the program as is, though. Storing just the sem refs is fine too.
In reply to Re^2: How to create a collection of shared scalars suitable for locking and signalling?
by ikegami
in thread How to create a collection of shared scalars suitable for locking and signalling?
by BrowserUk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |