This is test6.c in view mode; [Download] [Up]
/* * FILE: A test of async context switching in FP intensive environment */ #include<stdio.h> #include<stdlib.h> #include<pthread.h> #include<utils.h> #include<math.h> #define STACK_SIZE ((size_t)4096) pthread_attr_t attrib; pthread_t thread[40]; pthread_mutex_t mutex; pthread_cond_t cv; long double pigreco( void ) /* @@ */ { long double x; x = pow((double) 2, (double) 10); return x; } extern int sys_set_critical( void ); extern void sys_restore_critical( int f ); void * proc(void *arg) { double p; int i, n = (int) arg; int st; printf_r("attendo via libera %d\n", n); st = pthread_mutex_lock(&mutex); CHECK(st,"thread_mutex_lock"); st = pthread_cond_wait(&cv, &mutex); CHECK(st,"thread_cond_wait"); st = pthread_mutex_unlock(&mutex); CHECK(st,"thread_mutex_unlock"); printf_r("sveglio %d\n", n); for (i = 0; i < 10000000; i++) { p = pigreco(); } pthread_mutex_lock(&mutex); printf_r("%d finito %E\n", n, p); pthread_mutex_unlock(&mutex); return ((void *) 1); } int main(int argc, char *argv[]) { int i, st, N_PROCESS = 4; struct sched_param param = { SCHED_ROUND_ROBIN_C, PRI_RR_MAX, 1}; st = pthread_cond_init(&cv, NULL); CHECK(st, "thread_cond_init"); st = pthread_mutex_init(&mutex, NULL); CHECK(st, "thread_mutex_init"); (void) pthread_attr_init(&attrib); (void) pthread_attr_setdetachstate(&attrib, PTHREAD_CREATE_JOINABLE); (void) pthread_attr_setschedparam(&attrib, ¶m); (void) pthread_attr_setstacksize(&attrib, STACK_SIZE); printf_r("creo thread \n"); for (i = 0; i < N_PROCESS; i++) { (void) pthread_create(&thread[i], &attrib, proc, (void *) i); } sleep(2); printf_r("verde \n"); /* pthread_mutex_unlock(&mutex); @@ */ st = pthread_cond_broadcast(&cv); CHECK(st,"thread_cond_broadcast"); for (i = 0; i < N_PROCESS; i++) (void) pthread_join(thread[i], NULL); printf_r("thread terminati \n"); (void) pthread_attr_destroy(&attrib); (void) pthread_mutex_destroy(&mutex); (void) pthread_cond_destroy(&cv); return (EXIT_SUCCESS); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.