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.