Napisałem program obrazujący problem producent - konsument wykorzystujący wątki.
//deklaracje globalne
int bufor;
pthread_mutex_t producent_mutex=PTHREAD_MUTEX_INITIALIZER, konsument_mutex=PTHREAD_MUTEX_INITIALIZER;
//fragment main()
int main () {
...
pthread_mutex_lock(&konsument_mutex);
pthread_mutex_unlock(&producent_mutex);
pthread_create(&producent_t, NULL, producent, &x);
pthread_create(&konsument_t, NULL, konsument, &x);
...
}
void *producent (void *arg){
int x, i, produkt;
for (i=0;i<=10;i++) {
produkt=random()%100;
pthread_mutex_lock(&producent_mutex);
bufor=produkt; //<-zakomentowac
printf("Producent : Wkładam produkt %d do bufora .\n", produkt);
sleep(random()%5);
//bufor=produkt; //<-odkomentowac
printf(" Skonczylem :)\n");
pthread_mutex_unlock(&konsument_mutex);
}
}
void *konsument (void *arg){
int x, i, produkt;
for (i=0;i<=10;i++) {
pthread_mutex_lock(&konsument_mutex);
produkt=bufor; //<-zakomentowac
printf("Konsument : Konsumuje produkt %d z bufora .\n", produkt);
sleep(random()%5);
//produkt=bufor; //<-odkomentowac
printf(" Skonczylem :)\n\n");
pthread_mutex_unlock(&producent_mutex);
}
}
Zdziwiła mnie mocno jedna rzecz. Program w postaci jak powyzej dziala prawidlowo tzn. watek producent umieszcza produkt w buforze, a gdy skoncz, umozliwia watkowi konsument pobranie wartosci z bufora. Wynik:
Producent : Wkładam produkt 38 do bufora .
Skonczylem :)
Konsument : Konsumuje produkt 38 z bufora .
Skonczylem :)
Producent : Wkładam produkt 12 do bufora .
Skonczylem :)
Konsument : Konsumuje produkt 12 z bufora .
Skonczylem :)
Gdy zakomentuje sie linie oznaczone przez "<-zakomentuj" i odkomentuje te oznaczone przez "<-odkomentuj" program przestaje dzialac prawidlowo. Wynik:
Producent : Wkładam produkt 32 do bufora .
Skonczylem :)
Konsument : Konsumuje produkt 1073962240 z bufora .
Skonczylem :)
Producent : Wkładam produkt 53 do bufora .
Skonczylem :)
Konsument : Konsumuje produkt 32 z bufora .
Skonczylem :)
Za każdym razem przypisywanie/odczytywanie danych z bufora jest przed odblokowaniem mutexu dla konsumenta/producenta, dlatego nie rozumiem dlaczego robi to różnicę...
Moze ktos mi wyjasnic dlaczego tak się dzieje?