in reply to Re: threads - cond_timedwait question
in thread threads - cond_timedwait question

Now suppose that 'test' was a wedged thread.
  1. Change the 'sleep 10' in 'test' to 'sleep 30'.
  2. Change the 'time() + 15' to 'time() + 5'.
  3. Add a 'print "waiting\n"' before the 'last' statement.


I would expect the 'cond_timedwait' statement to return after 5 seconds and loop over the 'print ..' statement 5-6 times before the 'test' thread returned. Instead I see the 'test' thread start and block the loop until 'test' finishes.

Am I completely misunderstanding how this process works?
  • Comment on Re^2: threads - cond_timedwait question

Replies are listed 'Best First'.
Re^3: threads - cond_timedwait question
by ethrbunny (Monk) on Dec 31, 2009 at 22:32 UTC
    FWIW: this appears to work at detecting a 'stopped' job.
    #!/usr/bin/perl -w use threads; use Thread::Semaphore; $mtx = new Thread::Semaphore(2); $thr0 = async{ test() }; $thr1 = async{ timer( ) }; print "starting\n"; sleep(1); $v = $mtx->down(); print "test finished 1st\n" if ( $v == 2 ); print "timer finished 1st\n" if ( $v == 1 ); $thr0->detach(); $thr1->detach(); sub test { print " start(test)\n"; my $d = $mtx->down(); sleep( 5 ); $mtx->up( 3 ); print " exit(test)\n"; } sub timer { print " start(timer)\n"; my $d = $mtx->down(); sleep( 10 ); $mtx->up( 2 ); print " exit(timer)\n"; } start(test) starting start(timer) exit(test) test finished 1st
    Unfortunately this also gives me a 'A thread exited while 2 threads were running.' message at the end. I don't know how big of an issue this is.