#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>



typedef struct
{
   int *tab;
   int n;
} TypeTableau;

int comparaisonint(const void *a, const void *b)
{
   int *a1 = (int *) a;
   int *b1 = (int *) b;
   return (*a1 - *b1);
}

void *generetab(void *arg)
{
   TypeTableau *TAB = arg;
   int i;

   TAB->tab = calloc(TAB->n , sizeof(int));

	if(TAB->tab==NULL)
		printf("****out of memory !****\b\n");
	
   for (i = 0; i < TAB->n; i++)
   {
     	TAB->tab[i] = rand() % 100;

   }
   pthread_exit(NULL);
}

void *affichetab(void *arg)
{
   int i = 0;
   TypeTableau *TAB = arg;
   for (i = 0; i < TAB->n; i++)
   {
      printf("%d ", TAB->tab[i]);
   }
	printf("\n");
   pthread_exit(NULL);
}

void *trie_thread(void *arg)
{
   TypeTableau *TAB =arg;
   qsort((void *) TAB->tab, TAB->n, sizeof(int), comparaisonint);
   pthread_exit(NULL);
}

int main()
{
   pthread_t thread1, thread2, thread3, thread4;
   TypeTableau T;
   printf("Nombre d'elements du tableau:\n");
   scanf("%d", &T.n);

   pthread_create(&thread1, NULL, generetab,&T);
   pthread_join(thread1, NULL);

   pthread_create(&thread2, NULL, affichetab,&T);
   pthread_join(thread2, NULL);

   pthread_create(&thread3, NULL, trie_thread,&T);
   pthread_join(thread3, NULL);

   printf("Tableau tried: \n");

   pthread_create(&thread4, NULL, affichetab,&T);
   pthread_join(thread4, NULL);

   return 0;
}
