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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
--- main.c.bak 2008-12-02 00:20:34.000000000 +0100
+++ main.c 2008-12-02 01:32:04.000000000 +0100
@@ -4,10 +4,26 @@
#include <time.h>
#include <sched.h>
#include <errno.h>
+#include <unistd.h>
+#include <assert.h>
/*
gcc projet4.c -o p4 -lpthread -g3 -Wall
-gdb p4
+main.c: Dans la fonction «generateur» :
+main.c:35: attention : transtypage d'un pointeur vers un entier de taille différente
+main.c:53: attention : déclaration implicite de la fonction « «usleep» »
+main.c: Dans la fonction «lecteur» :
+main.c:82: attention : format «%d» expects type «int», but argument 2 has type «void *»
+main.c:84: attention : control reaches end of non-void function
+main.c: Dans la fonction «ecrivain» :
+main.c:88: attention : format «%d» expects type «int», but argument 2 has type «void *»
+main.c:91: attention : control reaches end of non-void function
+main.c: Dans la fonction «ajouterFile» :
+main.c:96: attention : déclaration implicite de la fonction « «filePleine» »
+main.c: Dans la fonction «main» :
+main.c:193: attention : transtypage vers un pointeur depuis un entier de taille différente
+main.c:199: attention : transtypage vers un pointeur depuis un entier de taille différente
+
*/
// Structure de file d'attente
@@ -20,23 +36,26 @@
// Déclarations globales
char priorite;
-pthread_mutex_t mutex1;
int BOITE[2]; // Le tableau BOITE sert d'interface entre le(s) générateur(s) et main()
// Paramètres du générateur de requêtes
pthread_mutex_t mutex_gen;
-int NB_QUERIES = 500;
+const int NB_QUERIES = 500;
int NB_CREES = 0;
int END = 0;
int TAILLE_FILE = 5;
int PERTES = 0; // Requêtes qui n'ont pu être traités pour cause de file d'attente pleine
+int filePleine(llfile file_attente) ;
+
void *generateur(void *param){
int type = (int)param; // Forcage de type à l'ancienne, sinon : erreur compilation illisible
int crees = 0; // Au début, on n'a pas encore créé de requête
int pause = 0;
int ma_boite = 0;
+ // j'ajoute ca car j'ai eu peur dans ton code principale : tu incremente i++ et tu le passes en argument dans cette fonction ?!
+ assert((type < 2) && (type >=0)) ;
printf("generateur %d initialise\n",type);
// Tant qu'on n'a pas atteint le nombre de requêtes à générer pour la simulation, on créé une nouvelle requête
@@ -44,7 +63,6 @@
pthread_mutex_lock(&mutex_gen);
ma_boite = BOITE[type];
- pthread_mutex_unlock(&mutex_gen);
// Si ma boite est vide, je vais générer une requête
if(ma_boite == 0){
@@ -53,41 +71,33 @@
usleep(pause);
//printf("sortie pause : %d ms\n",pause/1000);
- pthread_mutex_lock(&mutex_gen);
BOITE[type] = 1;
- pthread_mutex_unlock(&mutex_gen);
// Quand on a terminé une itération, on vient de générer une nouvelle requête, donc on met à jour le compteur
- pthread_mutex_lock(&mutex_gen);
NB_CREES++;
crees = NB_CREES;
- pthread_mutex_unlock(&mutex_gen);
}
// Sinon, j'attends que le main me prévienne que la boite est vide (pour éviter de pédaler dans la semoule)
/*else{
}*/
+ pthread_mutex_unlock(&mutex_gen);
}
- pthread_mutex_lock(&mutex_gen);
END++;
- pthread_mutex_unlock(&mutex_gen);
return 0;
}
-void *lecteur(void *tid){
- pthread_mutex_lock(&mutex1);
- pthread_mutex_unlock(&mutex1);
-
+void * lecteur(void *tid){
printf("\tL%d lit\n",tid);
usleep(10*1000);
+ return NULL ;
}
-void *ecrivain(void *tid){
- pthread_mutex_lock(&mutex1);
+void * ecrivain(void *tid){
printf("\tE%d ecrit\n",tid);
usleep(30*1000);
- pthread_mutex_unlock(&mutex1);
+ return NULL ;
}
// L'ajout d'une requête en file d'attente est une insertion en fin de liste
@@ -176,10 +186,9 @@
llfile file_attente = NULL; // Création de la file d'attente
- pthread_mutex_init(&mutex1, NULL);
pthread_mutex_init(&mutex_gen, NULL);
- // Création des deux générateurs de lecteurs et d'écrivains
+ // Création des deux générateurs de lecteurs et d'écrivains
pthread_create(&gen_lecteurs, NULL, generateur, (void*)0);
pthread_create(&gen_ecrivains, NULL, generateur, (void*)1);
@@ -227,7 +236,8 @@
BOITE[0] = 0;
BOITE[1] = 0;
}
- pthread_mutex_unlock(&mutex_gen);
+ // Pkoi ceci ?
+ // pthread_mutex_unlock(&mutex_gen);
}
pthread_join(gen_lecteurs,NULL); |
Partager