int main(){ Pilech pi=empty(); pilel pl=emptyl(); PileGe pg; Pile *L=pile_vide(); menuu(pg,L); return 0; }
void * wrapper(void *arg){ arg_t * arg2 = arg; bloc_t bloc; bloc_t bret[2]; int nb_bloc; int i; while(1){ //on lock le mutex pour demarrer pthread_mutex_lock(&mutex1); // verif tri terminé, on debloque les threads bloqué + mutex if(pile_vide(&ma_pile) && arg2->compteur == 0){ pthread_cond_broadcast(&cond); pthread_mutex_unlock(&mutex1); return NULL; } if(pile_vide(&ma_pile) && arg2->compteur > 0){ //deverouille le mutex et attends que cond soit signalée pthread_cond_wait(&cond,&mutex1); } //si pile pas vide if(!pile_vide(&ma_pile)){ arg2->compteur++; //on depile un bloc bloc = depile(&ma_pile); if(bloc.fin-bloc.debut > seuil_bloc_long){ //on le decoupe nb_bloc = rapide_decoupebloc(bloc,bret); //on empile les sous blocs for(i = 0; i < nb_bloc; i++) empile(&ma_pile,bret[i]); } else{ rapide_seq(bloc); } arg2->compteur--; } pthread_mutex_unlock(&mutex1); } }
/* Effectue un tri rapide séquentiel */ void rapide_seq(bloc_t bloc_init) { pile p; int i, nb_blocs; bloc_t bloc; bloc_t blocs[2]; init_pile(&p); empile(&p, bloc_init); /* Principe du tri rapide séquentiel : * tant qu’il y a des blocs à trier, dépile un bloc, le découpe en * (au maximum) deux sous-blocs non-encore triés et les empile */ do { bloc = depile(&p); nb_blocs = rapide_decoupebloc(bloc, blocs); for (i = 0; i < nb_blocs; i++) empile(&p, blocs[i]); } while (!pile_vide(&p)); }