This is test2.c in view mode; [Download] [Up]
/*
 * mutex.c.2   Test of the global mutex.
 */
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include "utils.h"
#define THREADS 3
void
locker( void )
{
   /*
    * Recursively lock the global mutex.
    */
   pthread_lock_global_np();
   pthread_lock_global_np();
   pthread_lock_global_np();
   pthread_unlock_global_np();
   pthread_unlock_global_np();
   pthread_unlock_global_np();
   pthread_exit( (void *) SUCCESS );
}
static pthread_t th[THREADS];
int 
main( int argc, char *argv[] )
{
   int i, status, exit_status;
   for(i = 0; i < THREADS; i++ )
   {
       status = create_joinable( &th[i], (thread_proc_t) locker, NULL );
       CHECK(status, "create_joinable()");
   }
   for(i = 0; i < THREADS; i++ )
   {
       status = pthread_join( th[i], (void **) &exit_status );
       CHECK(status, "pthread_join()");
   }
   return( EXIT_SUCCESS );
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.