Salve, sto iniziando a programmare con i thread... ho scritto un programma produttore-consumatore... il produttore inserisce un valore in una lista usata come buffer... Il consumatore prende un valore dalla lista e lo stampa su stdout. Il problema è che i thread non mi partono proprio... ho provato pure a far stampare subito qualcosa dentro la funzione del thread ma niente... ecco il programma:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
typedef struct node{
int info;
struct node* next;} node_t;
void* produttore(void* arg);
void* consumatore(void* arg);
node_t* produci();
void inserisci(node_t* p);
node_t* estrai();
node_t* head = NULL;
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int main(){
pthread_t prod, cons;
int err;
if ((err = pthread_create(&prod,NULL,&produttore,NULL)) != 0) printf("errore creazione produttore\n");
if ((err = pthread_create(&cons,NULL,&consumatore,NULL)) != 0) printf("errore creazione consumatore\n");
return 0;
}
void* produttore(void* arg){
node_t* p;
while(1){
p = produci();
pthread_mutex_lock(&mtx);
inserisci(p);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mtx);
sleep(2);
}
}
void* consumatore(void* arg){
node_t* p;
while(1){
pthread_mutex_lock(&mtx);
while (head == NULL){
pthread_cond_wait(&cond, &mtx);
printf("waken up!\n"); fflush(stdout);
}
p = estrai();
pthread_mutex_unlock(&mtx);
printf("%d\n", p->info);
free(p);
}
}
node_t* produci(){
srand(time(NULL));
int n = rand()%100;
node_t* p = malloc(sizeof(node_t));
p->info = n;
p->next = NULL;
return p;
}
void inserisci(node_t* p){
node_t* aux = head;
if (head == NULL) head = p;
else {
while (aux->next != NULL) aux = aux->next;
aux = p;
}
}
node_t* estrai(){
node_t* aux = head;
node_t* p;
while (aux->next->next != NULL) aux = aux->next;
p = aux->next;
aux->next = NULL;
return p;
}