Problemi di stallo con lock e wait in C

di il
3 risposte

Problemi di stallo con lock e wait in C

Come scritto nel titolo, nel caso in cui tento di rimuovere quando la lista è vuota mi porta ad una situazione di stallo nella removeNode, non rilasciando quindi la lock e non permettendomi di inserire nuovi valori.
Grazie mille a tutti quelli che proveranno ad aiutarmi

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

#define LOCK(l)      if (pthread_mutex_lock(l)!=0)        { \
    fprintf(stderr, "ERRORE FATALE lock\n");            \
    pthread_exit((void*)EXIT_FAILURE);                \
  }
#define UNLOCK(l)    if (pthread_mutex_unlock(l)!=0)      { \
  fprintf(stderr, "ERRORE FATALE unlock\n");            \
  pthread_exit((void*)EXIT_FAILURE);                    \
  }
#define WAIT(c,l)    if (pthread_cond_wait(c,l)!=0)       { \
    fprintf(stderr, "ERRORE FATALE wait\n");            \
    pthread_exit((void*)EXIT_FAILURE);                    \
}
#define SIGNAL(c)    if (pthread_cond_signal(c)!=0)       {    \
    fprintf(stderr, "ERRORE FATALE signal\n");            \
    pthread_exit((void*)EXIT_FAILURE);                    \
  }

typedef struct node {
    int data;
    struct node * next;
} node;

pthread_mutex_t lock_coda = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t not_empty = PTHREAD_COND_INITIALIZER;

void insertNode (node ** list, int data);
int removeNode (node ** list);
int findNode(node** list, int data);
void stampalista(node* lis);

node * lista = NULL;

int len(node* lis){
    node* curr = lis;
    int value = 0;
    
    if(curr == NULL){
        return 0;
    }
    
    while(curr != NULL){
        value++;
        curr = curr->next;
    }
    return value;
}



int main(int argc, const char * argv[]) {
    int value=0;
    while(1){
        while(scanf("%d",&value) != 1){
            printf("Errore. Inserisci un numero\n");
            scanf("%*[^\n]");
        }
        if(value > 0){
            insertNode(&lista, value);
        }
        else if(value == 0){
            removeNode(&lista);
        }
        else{
            stampalista(lista);
            break;
        }
    }
    return 0;
}


void stampalista(node* lis){
    if(lis != NULL){
        printf("%d -> ",lis->data);
        stampalista(lis->next);
    }
    else{
        printf("NULL\n");
    }
}

//INSERIMENTO IN TESTA
void insertNode (node ** list, int data) {

    LOCK(&lock_coda);

    node * new = malloc(sizeof(node));
    new->data = data;
    new->next = *list;

    //INSERISCI IN TESTA
    *list = new;

    SIGNAL(&not_empty);
    UNLOCK(&lock_coda);
    
    printf("inserito con successo\n");

}

//RIMOZIONE IN CODA
int removeNode (node ** list) {

    LOCK(&lock_coda);

    while (lista == NULL) {
        printf("aspetto\n");
        int err = pthread_cond_wait(&not_empty, &lock_coda);
        printf("%d\n", err);
        printf("Un va oltre\n");
    }
    
    int data;
    node * curr = *list;
    node * prev = NULL;
    while (curr->next != NULL) {
        prev = curr;
        curr = curr->next;
    }
    data = curr->data;

    if (prev == NULL) {
        free(curr);
        *list = NULL;
    }else{
        prev->next = NULL;
        free(curr);
    }

    UNLOCK(&lock_coda);
    printf("Eliminato con successo\n");
    return data;
}

int findNode(node** list, int data){
    LOCK(&lock_coda);

    node* curr = *list;
    while(curr != NULL){
        if(curr->data == data){
            return 1;
        }
        else{
            curr = curr->next;
        }
    }

    UNLOCK(&lock_coda);
    return 0;
}

3 Risposte

  • Re: Problemi di stallo con lock e wait in C

    Dipende dalfatto che
     while (lista == NULL) {
            printf("aspetto\n");
            int err = pthread_cond_wait(&not_empty, &lock_coda);
            printf("%d\n", err);
            printf("Un va oltre\n");
        }
    
    non trova una via d'uscita.
    secondome sarebbe più corretto se cambiassi il blocco
    
    if (lista==NULL) 
      {
      printf("Lista Vuota riempila e poi ne parliamo!\n");
      return 1;
      }
      
    poi il valore di ritorno lo gestisci per far cambiare l'opzione.
    spero di esserti stato di aiuto
  • Re: Problemi di stallo con lock e wait in C

    Poi scusa perchè usi lista quando il parametro della funzione è list?
  • Re: Problemi di stallo con lock e wait in C

    smalldragon ha scritto:


    Poi scusa perchè usi lista quando il parametro della funzione è list?
    Errore mio, mi sono accorto successivamente della svista, provo quello che hai detto, grazie per ora
Devi accedere o registrarti per scrivere nel forum
3 risposte