This is test5.c in view mode; [Download] [Up]
/*
* FILE: A test of pthread_cancel() and friends.
*/
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
#include <utils.h>
static int safe = FALSE;
static pthread_t *th;
static pthread_mutex_t mu;
static pthread_cond_t cv;
static void
cv_timer( struct timespec *ts )
{
int status, success = SUCCESS;
status = pthread_mutex_lock( &mu );
CHECK(status, "pthread_mutex_lock()" );
while( !safe )
{
status = pthread_cond_timedwait( &cv, &mu, ts );
CHECK( status, "pthread_cond_timedwait()" );
}
status = pthread_mutex_unlock( &mu );
CHECK(status, "pthread_mutex_unlock()" );
pthread_exit( (void *) success );
}
int
main( int argc, char *argv[] )
{
int i, st, exit_status, thread_count = 1;
struct timespec *tspec;
if( argc == 2 )
thread_count = atoi( argv[1] );
st = pthread_mutex_init( &mu, NULL );
CHECK( st, "pthread_mutex_init()");
st = pthread_cond_init( &cv, NULL );
CHECK( st, "pthread_cond_init()");
th = malloc_r( thread_count * sizeof( pthread_t ) );
tspec = malloc_r( thread_count * sizeof( struct timespec ) );
for(i = 0; i < thread_count; i++ )
{
tspec[i].tv_sec = 1;
tspec[i].tv_nsec = rand() % 9999;
st = create_joinable( &th[i], (thread_proc_t) cv_timer, &tspec[i] );
CHECK( st, "create_joinable()");
st = pthread_cancel( th[i] );
CHECK(st, "pthread_cancel()");
pthread_yield( NULL );
}
safe = TRUE;
for(i = 0; i < thread_count; i++ )
{
st = pthread_join( th[i], (void **) &exit_status );
CHECK( st, "pthread_join()");
if( exit_status != SUCCESS )
{
if( exit_status == PTHREAD_CANCELED )
printf_r("th[%d] was cancelled!\n", i );
else
printf_r( "th[%d] exited with error status %d!\n", i, exit_status );
}
}
free_r( th );
free_r( tspec );
st = pthread_cond_destroy( &cv );
CHECK( st, "pthread_cond_destroy()");
st = pthread_mutex_destroy( &mu );
CHECK( st, "pthread_mutex_destroy()");
print_system_counters();
return( EXIT_SUCCESS );
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.