Thanks. That clears up the cond_signal thing, but regarding the caveat and your update.
With the following code, which I think incorporates all your changes,if I leave the sleep in, or as show, replace it by yield, any number of threads appear to run reliably.
But if I comment out the yields, it locks up almost straight away. Do you get a different result?
I'm running this on a single processor. Are you using a multi?
use strict; use warnings; use Time::HiRes 'sleep'; use threads 'yield'; use threads::shared; my $baton:shared = 0; sub sprinter { my ($no_of_threads,$sleep) = @_; my $id = threads->self->tid; warn ("Thread $id started\n"); while (1) { lock ($baton); cond_wait ($baton) until $baton == $id; warn ("Thread $id has the baton\n"); # yield; $baton = int (rand ($no_of_threads)) until $baton != $id; warn ("Thread $id passing the baton to thread $baton\n"); cond_broadcast ($baton); } } my ($no_of_sprinters) = @ARGV; $no_of_sprinters ||= 3; my @threads; push @threads,threads->new (\&sprinter,$no_of_sprinters) for 1..$no_of_sprinters; sleep 1; while(1){ lock ($baton); cond_wait ($baton) until $baton == 0; warn ("Thread 0 has the baton\n"); # yield; $baton = int (rand ($no_of_sprinters))+1 until $baton != 0; warn ("Thread 0 passing the baton to thread $baton\n"); cond_broadcast ($baton); }
In reply to Re^2: baton passing threads and cond_signal
by Anonymous Monk
in thread baton passing threads and cond_signal
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |