1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| #include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define N 14
static pthread_rwlock_t verrou=PTHREAD_RWLOCK_INITIALIZER; //permet l'exclusion mutuelle
static int tab[N]={7, 4, 3, 12, 20, 9, 15, 31, 25, 19, 28, 40, 47,39};
static int i;
struct borne {
int debut;
int fin;
};
struct borne *tab1;
struct borne *tab2;
//fonction Multiplier exécuté par les deux threads
void *multi (void * para)
{
tab1=(struct borne *) para;
int n=0;
sleep(5);
pthread_rwlock_rdlock (&verrou);
for (i=tab1->debut;i<=tab1->fin;i++){
n=tab[i];
tab[i]=n*n;
printf ("Nouvelle valeur à la position %d du tableau: %d * %d = %d\n",i, n, n, tab[i]);
}
pthread_rwlock_unlock (&verrou);
pthread_exit (0);
}
//fonction Trier exécuté par les deux threads
void *trier (void * para)
{
tab2=(struct borne *) para;
int a=0;
int changement=1;
sleep(5);
pthread_rwlock_rdlock (&verrou);
while(changement>0){ //tant qu'il ya des valeurs à échanger
changement=0; // on réinitialise changement quand la boucle repart
for(i=tab2->debut;i<=tab2->fin;i++){
if(tab[i+1]<tab[i]){ //on compare chaque élément à son voisin
a=tab[i]; //on les interverti si nécessaire
tab[i+1]=tab[i];
a=tab[i];
changement++; //on signale qu'il ya eu un changement
}
}
}
a=0;
printf ("Voici la mmoitié du tableau trié: \n");
for (a=tab2->debut;a<=tab2->fin;a++)
printf ("N°: %d = %d\n", a, tab2[a]);
pthread_rwlock_unlock (&verrou);
pthread_exit (0);
}
main (int ac, char **av)
{
//déclaration des threads
pthread_t t1, t2;
void *attente;
i=0;
//initilaisation du verrou
// pthread_rwlock_init (&verrou, PTHREAD_RWLOCK_INITIALIZER);
//creation du thread 1
tab1->debut=0;
tab1->fin=6;
if (pthread_create (&t1, NULL, multi, (void *) tab1) < 0) {
fprintf (stderr, "erreur lors de la creation du thread 1\n");
exit (1);
}
if (pthread_create (&t1, NULL, trier, (void *) tab1) < 0) {
fprintf (stderr, "erreur lors de la creation du thread 1\n");
exit (1);
}
//creation du thread 2
tab2->debut=7;
tab2->fin=13;
if (pthread_create (&t1, NULL, multi, (void *) tab2) < 0) {
fprintf (stderr, "erreur lors de la creation du thread 1\n");
exit (1);
}
if (pthread_create (&t1, NULL, trier, (void *) tab2) < 0) {
fprintf (stderr, "erreur lors de la creation du thread 1\n");
exit (1);
}
//attente de la fin du thread 1
(void)pthread_join (t1, &attente);
//attente de la fin du thread 2
(void)pthread_join (t2, &attente);
} |
Partager