signal handler priority issue
    Daniel Eischen 
    eischen at vigrid.com
       
    Fri Jun 11 08:27:16 GMT 2004
    
    
  
On Fri, 11 Jun 2004, Sean McNeil wrote:
> Now here is something odd....
> 
> If I change the program a little, it acts completely different.  It
> actually works faster and looks correct.  I don't get it.  This is
> pretty much exactly what boehm-gc is doing.
> 
> static void
> pause_threads(void)
> {
>         int i;
> 
>         printf("Master: pausing all threads.\n");
>         for (i = 0; i < NUM_THREADS; i++) {
>                 pthread_kill(tids[i], SIGUSR1);
>         }
>         for (i = 0; i < NUM_THREADS; i++) {
>                 if (sem_wait(&semaphore) == -1)
>                         errno_abort("Wait on semaphore");
>         }
> }
Yeah, I almost coded it this way.  It seems to work faster because
the threads are true workers.  They're spinning wasting the CPU.
The timeslice is 10 or 20 msec, so you have to wait for each thread
to get timesliced out in order for it to have the signal delivered.
Instead of:
  thread 1 spin for 10msec
  master kill thread 1
  master wait thread for thread 1
  thread 2 spin for 10msec
  thread 3 spin for 10msec
  thread 4 spin for 10msec
  thread 5 spin for 10msec
  master wakeup from thread 1
  master kill thread 2
  thread 3 spin for 10msec
  thread 4 spin for 10msec
  thread 5 spin for 10msec
  master wakeup from thread 2
  master kill thread 3
  ...
you have
  threads running
  master thread gets his chance
  master kill thread 1
  master kill thread 2
  master kill thread 3
  master kill thread 4
  master kill thread 5
  thread 1 swapped back in, gets signal, pauses
  thread 2 swapped back in, gets signal, pauses
  thread 3 swapped back in, gets signal, pauses
  thread 4 swapped back in, gets signal, pauses
  thread 5 swapped back in, gets signal, pauses
-- 
Dan Eischen
    
    
More information about the freebsd-threads
mailing list