ftp.nice.ch/Attic/openStep/implementation/gnustep/sources/alpha-snapshots/pthreads.0.9.2.tgz#/pthreads-0.9.2/test_threads/test6.c

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, &param);
  (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.