Skip to content
Extraits de code Groupes Projets
Valider ca0fb492 rédigé par Hugo Clercq's avatar Hugo Clercq
Parcourir les fichiers

temp solution for deadlock, need generalization

parent ca117713
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -56,6 +56,8 @@ sem_t empty2;
sem_t full2;
pthread_mutex_t mutex2;
int counter;
/*
* Constructor for a new Queue empty
* mode: 0 -> buffer type = dividers_t
......@@ -93,6 +95,7 @@ void push(queue_t *queue, long long value){//Push value into the queue
long long pop(queue_t *queue){
long long result = queue->buffer[queue->head];
queue->buffer[queue->head] = (long long)0;
queue->head = (queue->head + 1) % (queue->sizeMax);//Update index
queue->size--;
return result;
......@@ -299,13 +302,12 @@ void* produce(){
sem_wait(&empty);
pthread_mutex_lock(&mutex);
push(buffer, number);
if(read != -1)
done = 0;
pthread_mutex_unlock(&mutex);
sem_post(&full);
printf("done = %d\n",done );
//end of critical area
}
//done = 0;
done = 0;
fclose(fdIn);
free(line);
return NULL;
......@@ -319,8 +321,14 @@ void* compute(){
printf("waiting compute\n");
sem_wait(&full);
pthread_mutex_lock(&mutex);
number = pop(buffer);
printf("COMPUTING : %lld\n",number );
if(counter <=0){
}
else{
number = pop(buffer);
printf("COMPUTING : %lld\n",number );
}
pthread_mutex_unlock(&mutex);
sem_post(&empty);
//end of critical area
......@@ -331,10 +339,22 @@ void* compute(){
sem_wait(&empty2);
pthread_mutex_lock(&mutex2);
div_push(buffer2, result);
if(done || buffer->size != 0)
if(counter <= 0){
printf("HIIIIII\n" );
pthread_mutex_unlock(&mutex2);
sem_post(&empty2);
return NULL;
}
/*
if(!done && buffer->size <= Args.nThreads)
done2--;
*/
counter--;
printf("counter %d\n",counter );
pthread_mutex_unlock(&mutex2);
sem_post(&full2);
//printf("done2 = %d\n",done2 );
//end of critical area
}
/*
......@@ -353,33 +373,54 @@ void* consume(){
}
dividers_t result;
int tmp = 1;
pthread_mutex_lock(&mutex2);
if (done2)
tmp = done2;
pthread_mutex_unlock(&mutex2);
while (tmp || buffer2->size != 0){
//while (done2 || buffer2->size != 0){
while (counter || buffer2->size != 0){
//start of critical area
printf("waiting consume\n");
sem_wait(&full2);
pthread_mutex_lock(&mutex2);
result= div_pop(buffer2);
printf("consumed %lld\n",result.value );
pthread_mutex_unlock(&mutex2);
sem_post(&empty2);
//end of critical area
if(counter <= 0){
printf("HEEEEEEE\n" );
printf("consumed %lld\n",result.value );
if(result.value == 0){
free(result.dividers);
pthread_mutex_unlock(&mutex2);
sem_post(&empty2);
}
else{
fprintf(fdOut, "%lld", result.value);
if (result.length != 0){
for(int i = 0; i<result.length; i++){
fprintf(fdOut, " %lld", result.dividers[i]);
}
}
fprintf(fdOut, "\n");
free(result.dividers);
pthread_mutex_unlock(&mutex2);
sem_post(&empty2);
}
fprintf(fdOut, "%lld", result.value);
}
else{
printf("consumed %lld\n",result.value );
pthread_mutex_unlock(&mutex2);
sem_post(&empty2);
//end of critical area
fprintf(fdOut, "%lld", result.value);
if (result.length != 0){
for(int i = 0; i<result.length; i++){
fprintf(fdOut, " %lld", result.dividers[i]);
if (result.length != 0){
for(int i = 0; i<result.length; i++){
fprintf(fdOut, " %lld", result.dividers[i]);
}
}
fprintf(fdOut, "\n");
free(result.dividers);
}
fprintf(fdOut, "\n");
free(result.dividers);
}
......
......@@ -41,7 +41,7 @@ int main(int argc, char** argv){
printf("Open Error in main for fd LineCounter\n");
exit(EXIT_FAILURE);
}
int counter = 0;
counter = 0;
char* line = NULL;
size_t len = 0;
char* eptr;
......@@ -51,6 +51,7 @@ int main(int argc, char** argv){
fclose(LineCounter);
free(line);
printf("counter BEFORE : %d\n",counter );
if (counter < Args.nThreads){
Args.nThreads = counter;
}
......@@ -94,6 +95,17 @@ int main(int argc, char** argv){
printf("Error while joining the reader thread");
return EXIT_FAILURE;
}
//done = 0 for sure
//sem_post(&full);
//sem_wait(&empty);
//sem_post(&empty);
sem_post(&full);
sem_post(&full);
sem_post(&full);
sem_post(&full);
sem_post(&full);
sem_post(&full);
sem_post(&full);
printf("------------ joined reader ---------------\n");
for(int i =0; i < Args.nThreads; i++){
......@@ -102,8 +114,14 @@ int main(int argc, char** argv){
return EXIT_FAILURE;
}
}
//sem_post(&full2);
sem_post(&full2);
sem_post(&full2);
sem_post(&full2);
sem_post(&full2);
sem_post(&full2);
sem_post(&full2);
sem_post(&full2);
done2=0;
printf("------------- joined compute ------------\n");
if(pthread_join(writer, (void**) &error) != 0){
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter