Pages: [1]   Go Down
Print
Author Topic: Produttore e consumatore: Un chiarimento?  (Read 1818 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Nova
Forumista
***
Offline Offline

Gender: Male
Posts: 567


-.-"


WWW
« on: 01-03-2010, 10:13:07 »

Code:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <time.h>

#define MAX 10
#define N 12

int buff[MAX];
int cont=0;
pthread_mutex_t mux;

void print_buff(int * buff)
{
int i;
printf("[ ");
for (i=0; i<sizeof(buff); i++)
{
printf(" %i ", buff[i]);
}
printf(" ]\n");
}

void init_buff(int * buffer)
{
int i;
for (i = 0; i < sizeof(buffer); i++)
{
buffer[i]=0;
}
return;
}

void * produci(void * par)
{
pthread_mutex_lock(&mux);
if ((buff[MAX] == 0) && (cont != N))
{
int j, roba = (rand()%6)+1;
for (j=0; j< roba; j++)
{
buff[j]=1;
}
printf("Ho inserito %i cose dentro il buffer\n", roba);
print_buff(buff);
cont++;
}
else
{
if (cont !=N)
{
printf("Buffer pieno\n");
}
else
{
pthread_exit(0);
}
}
pthread_mutex_unlock(&mux);
}

void * consuma(void * par)
{
pthread_mutex_lock(&mux);
if (cont != N)
{
int k=1;
int m=0;
while(k)
{
if (buff[m] != 0) {m++;}
else
{
k=0;
}
}

int r =(rand()%6)+1;
int cons =r;
for (; cons>=0; cons--)
{
buff[m--]=0;
}

printf("ho consumato %i elementi del buffer\n", r);
print_buff(buff);
}
else
{
pthread_exit(0);
}
pthread_mutex_unlock(&mux);
}

int main()
{
pthread_mutex_init(&mux, NULL);
pthread_t produttore;
pthread_t consumatore;
init_buff(buff);
srand(time(NULL));

pthread_create(&produttore, NULL, produci, NULL);
pthread_create(&consumatore, NULL, consuma, NULL);

pthread_join(produttore, NULL);
pthread_join(consumatore, NULL);
exit(0);
}


Questo listato risolve il problema del produttore/consumatore e funziona. L'unico problema è che se viene eseguito mi mostra a video soltanto la prima volta che il thread esegue la funzione. Come mai?
Logged

Ubuntu user:
#29872
LtWorf
Forumista Esperto
****
Offline Offline

Posts: 1.079

Ogni cosa da me scritta è da intendersi come opinione personale e non come dato di fatto. Anche le eventuali dimostrazioni matematiche da me scritte saranno opinioni personali e quindi dovranno venire dimostrate da una terza parte di fiducia


WWW
« Reply #1 on: 01-03-2010, 22:52:15 »

Non mi sembra molto buona questa soluzione...

Premettendo che non l'ho letto per intero, intanto di solito il problema si risolve mettendo in pausa quando il buffer è pieno, e non terminando come fai tu.

Se il produttore tenta di produrre ma il buffer è pieno, il produttore termina e il lock sul buffer rimane. Per cui il buffer rimane pieno e il consumatore non consuma.
Logged

There are some OO programming languages. I will create the first -_-' language.

LtWorf
Nova
Forumista
***
Offline Offline

Gender: Male
Posts: 567


-.-"


WWW
« Reply #2 on: 02-03-2010, 09:40:17 »

No salvo, è solo un modo per farlo terminare velocemente, tutto qua. :p
Logged

Ubuntu user:
#29872
LtWorf
Forumista Esperto
****
Offline Offline

Posts: 1.079

Ogni cosa da me scritta è da intendersi come opinione personale e non come dato di fatto. Anche le eventuali dimostrazioni matematiche da me scritte saranno opinioni personali e quindi dovranno venire dimostrate da una terza parte di fiducia


WWW
« Reply #3 on: 02-03-2010, 10:48:37 »

Sarà, ma ti assicuro che non funziona come sostieni tu. Se vuoi terminare velocemente usa control+C.
Logged

There are some OO programming languages. I will create the first -_-' language.

LtWorf
Nova
Forumista
***
Offline Offline

Gender: Male
Posts: 567


-.-"


WWW
« Reply #4 on: 02-03-2010, 17:17:31 »

Ma cosa dovrei sistemare nel mio codice?
Logged

Ubuntu user:
#29872
LtWorf
Forumista Esperto
****
Offline Offline

Posts: 1.079

Ogni cosa da me scritta è da intendersi come opinione personale e non come dato di fatto. Anche le eventuali dimostrazioni matematiche da me scritte saranno opinioni personali e quindi dovranno venire dimostrate da una terza parte di fiducia


WWW
« Reply #5 on: 02-03-2010, 17:54:39 »

In pratica non dovresti terminare, ma continuare a produrre e consumare, e se vuoi terminare non dovresti lasciare il lock. Praticamente non è che non ti funziona la print, è che non funziona del tutto. E il fatto che stampa una sola volta ne è il sintomo.
Logged

There are some OO programming languages. I will create the first -_-' language.

LtWorf
Nova
Forumista
***
Offline Offline

Gender: Male
Posts: 567


-.-"


WWW
« Reply #6 on: 02-03-2010, 18:28:48 »

Capito, chiaro, grazie Wink


P.s.

La firma sullo scheduling dei processi delle macchine Klingon fa morire XD
Logged

Ubuntu user:
#29872
Pages: [1]   Go Up
Print
Jump to: