/* Factoriel: version recursive parallele dichotomique avec valeur de coupure.
   Compilation et execution sur Solaris:
     gcc THISFILE.c -o fact -lpthread -lposix4
     fact n coupure
*/
 
#include <pthread.h>
#include <stdio.h>
#include <assert.h>

/* Attribut (global) pour creation des divers threads. */
#define SHARED 1
pthread_attr_t attr;

/* Structure pour les arguments lors des appels a fact. */
typedef struct {
  int inf, sup;
  int coupure;
} Args;

void* fact(void* _args);

int main(int argc, char *argv[]) {
  pthread_t fid;  
  int n,        /* Valeur lue a l'appel du programme. */
      res,      /* Variable ou mettre le resultat. */
      coupure;  /* Valeur de coupure pour la recursion. */
  Args args;    /* Les arguments. */

  /* Initialisation (standard) de la structure d'attribut pour le thread. */
  pthread_attr_init(&attr);
  pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);

  /* Lecture des arguments a utiliser pour l'appel. */
  assert( argc >= 3 );
  n = atoi(argv[1]);
  coupure = atoi(argv[2]);
  assert( n >= 0 && coupure >= 1 );

  /* Creation du thread principal. */
  args.inf = 1;
  args.sup = n;
  args.coupure = coupure;
  pthread_create(&fid, &attr, fact, &args);

  /* Attente pour le thread enfant se termine. */
  pthread_join(fid, (void *) &res);
  printf( "fact( %d ) = %d\n", n, res );
}

/* Definition de la procedure fact. */
void* fact(void* _args) 
{
  # Procedure a completer pour l'exercice.
  ...
}
