[Risolto]Produttore consumatore (thread)

di il
2 risposte

[Risolto]Produttore consumatore (thread)

Salve a tutti come da titolo ho bisogno di una piccola mano con questo esercizio: creare M produttori e N consumatori in thread i produttori devono produrre K messaggi (in media ogni produttore fa K/M messaggi i rimanenti, se ci sono, li fa l'ultimo thread creato). I consumatori devono "leggere" ed eliminare i messaggi fino a quando incontrano un messaggio con scritto STOP.

Io ho scritto questo:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <errno.h>

typedef struct bcoda{
	char *m;
	struct bcoda *next;
}nodo;

static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

static nodo *coda=NULL;
static int fine;

void lock_acquire(pthread_mutex_t *mtx){ 
	int err;
	if ( ( err=pthread_mutex_lock(mtx)) != 0 ) {
		errno=err;
		perror("lock");
		pthread_exit(errno); 
	}
}

void lock_release(pthread_mutex_t *mtx){ 
	int err;
	if ( ( err=pthread_mutex_unlock(mtx)) != 0 ) {
		errno=err;
		perror("lock");
		pthread_exit(errno); 
	}
}

nodo *add(nodo *buf,char *w){
	if(buf==NULL){
		nodo *new=malloc(sizeof(nodo));
		int l=strlen(w);
		l++;
		new->m=malloc(l*sizeof(char));
		strcpy(new->m,w);
		new->next=NULL;
		return new;
	}else{
		buf->next=add(buf->next,w);
	}
	return buf;
}

static void *produttore(int n){
	int x=n;
	while(x>0){
		lock_acquire(&mtx);
		if(fine==1){
			coda=add(coda,"STOP");
		}else{
			coda=add(coda,"CIAO");
			fine--;
		}
		pthread_cond_signal(&cond);
		lock_release(&mtx);
		x--;
	}
}

static void *consumatore(){
	while(1){
		lock_acquire(&mtx);
		while(coda==NULL){
			pthread_cond_wait(&cond,&mtx);
		}
		if(strcmp(coda->m,"STOP")!=0){
			nodo *temp=coda;
			coda=coda->next;
			free(temp);
			lock_release(&mtx);
		}else{
			pthread_cond_signal(&cond);
			lock_release(&mtx);
			break;
		}
	}
}
		
int main(){
	int i,M,N,K,err,count=0;
	int messxtrd;
	printf("Quanti produttori? ");
	scanf("%d",&M);
	printf("Quanti consumatori? ");
	scanf("%d",&N);
	printf("Quanti messaggi vuoi far produrre? ");
	scanf("%d",&K);
	fine=K;
	pthread_t *trd;
	i=M+N;
	trd=malloc(i*sizeof(pthread_t));
	messxtrd=K/M;
	for(i=0;i<M;i++){
		if(i==(M-1)){
			messxtrd=(K-count);
		}
		err=pthread_create(&trd[i],NULL,&produttore,messxtrd);
		if(err<0){
			perror("thread");
			exit(EXIT_FAILURE);
		}
		count+=messxtrd;
	}
	for(i=0;i<N;i++){
		err=pthread_create(&trd[i+M],NULL,&consumatore,NULL);
		if(err<0){
			perror("thread");
			exit(EXIT_FAILURE);
		}
	}
	for(i=0;i<(N+M);i++){
		pthread_join(trd[i],NULL);
	}
	printf("%s\n",coda->m);
	free(coda);
	return 0;
}
Attraverso vari test da me effettuati il problema mi sembra nei consumatori cioè che non tutti riescono a terminare però non capisco proprio il perchè (vedere il codice consumatore)...Qualcuno puo' aiutarmi? grazie

2 Risposte

Devi accedere o registrarti per scrivere nel forum
2 risposte