[C] Problemi di stallo con lock e wait

pablito7011

Nuovo Utente
2
0
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


Codice:
#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;
}
 
Ultima modifica:

Moffetta88

Moderatore
Staff Forum
Utente Èlite
20,539
12,919
CPU
i5-4690
Dissipatore
DEEPCOOL CAPTAIN 240EX
Scheda Madre
MSI Z97 U3 PLUS
HDD
KINGSTON SSD KC400 240GB
RAM
24GB BALLISTIX SPORT @2133MHz
GPU
STRIX GTX980 DC2OC
Audio
INTEGRATA
Monitor
AOC G2590VXQ
PSU
BEQUIET! System Power 7 500W
Case
DEEPCOOL MATREXX 55
Periferiche
NESSUNA
Net
EOLO 100
OS
UBUNTU/WINDOWS11
Gentilmente leggi la guida della sezione
Usa il tag CODE altrimenti è impossibile leggere quel wall-of-text
 

pablito7011

Nuovo Utente
2
0
Gentilmente leggi la guida della sezione
Usa il tag CODE altrimenti è impossibile leggere quel wall-of-text
Fatto
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili