This is test1.c in view mode; [Download] [Up]
/*
* mutex.c.1
*/
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include "utils.h"
void lock_mu( pthread_mutex_t *mu )
{
int st;
printf_r("Child attempting to lock mutex\n");
st = pthread_mutex_lock( mu );
CHECK(st, "pthread_mutex_lock()");
printf_r("...Child has locked mutex\n");
st = pthread_mutex_unlock( mu );
CHECK(st, "pthread_mutex_unlock()");
printf_r("...Child has unlocked mutex\n");
pthread_exit( (void *) SUCCESS );
}
void
init_mu( pthread_mutex_t *mu )
{
int st;
st = pthread_mutex_init( mu, NULL );
CHECK( st, "pthread_mutex_init()");
}
void
destroy_mu( pthread_mutex_t *mu )
{
int st;
st = pthread_mutex_destroy( mu );
CHECK(st, "pthread_mutex_destroy()");
}
static pthread_mutex_t mutex;
static pthread_t th;
int
main( int argc, char *argv[] )
{
int st, exit_status;
pthread_attr_t th_attr;
init_mu( &mutex );
/*
* -- Set the child's thread attributes so that the main() thread
* can join it.
*/
(void) pthread_attr_init( &th_attr );
(void) pthread_attr_setdetachstate( &th_attr, PTHREAD_CREATE_JOINABLE );
/*
* -- Now, lock the mutex, and create the child thread. The child
* will attempt to lock the same mutex, and block until
* the mutex is released.
*/
st = pthread_mutex_lock( &mutex );
CHECK(st, "pthread_mutex_lock()");
printf_r("Main has locked the mutex\n");
/*
* -- This is the second thread that should block when it attempts to
* lock mu.
*/
st = pthread_create( &th, &th_attr, (thread_proc_t)lock_mu, &mutex );
CHECK(st, "pthread_create()");
pthread_yield( NULL );
/*
* -- Unlock the mutex
*/
st = pthread_mutex_unlock( &mutex );
CHECK(st, "pthread_mutex_unlock()");
printf_r("Main has unlocked the mutex\n");
st = pthread_join( th, (void **) &exit_status );
CHECK(st, "pthread_join()");
if( exit_status != SUCCESS )
printf_r("Failed to join\n");
destroy_mu( &mutex );
return( EXIT_SUCCESS );
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.