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.