Zależy mi, żeby zmienna globalna n była wyświetlana przez wątek konsument na bieżąco - po każdej zmianie przez wątek producent0. Teraz wyświetla tak jakby dopiero po wykonaniu się wątku producent0. Na wyjściu jest 5,5,5,5,5, a chciałbym, żeby było: 1,2,3,4,5. W skrócie - tak jakby jedna funkcja w tym momencie wywoływała inną - do wyświetlania. Przepraszam za kod - to dopiero mój pierwszy z wątkami i nie za bardzo jeszcze to ogarniam - mam nadzieję, że nie jest najgorzej. I ostatecznie oczywiście będzie więcej wątków producentów, ale niestety nie potrafię sobie poradzić nawet z czymś tak łatwym.
#define ILOSC 5
int n=0;
/* mutexy */
struct {
pthread_mutex_t mutex;
} szukanie = { PTHREAD_MUTEX_INITIALIZER };
struct {
pthread_mutex_t mutex;
pthread_cond_t cond;
int znaleziono;
} znaleziono = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER };
void *producent0 (void *_arg)
{
while (n<5)
{ pthread_mutex_lock(&szukanie.mutex);
n=n+1;
pthread_mutex_unlock(&szukanie.mutex);
pthread_mutex_lock(&znaleziono.mutex);
if (znaleziono.znaleziono == 0)
pthread_cond_signal(&znaleziono.cond);
znaleziono.znaleziono++;
pthread_mutex_unlock(&znaleziono.mutex);
}
return EXIT_SUCCESS;
}
void *konsument (void *_arg)
{
for (int i = 0; i < ILOSC; i++)
{
pthread_mutex_lock(&znaleziono.mutex); while (znaleziono.znaleziono == 0)
pthread_cond_wait(&znaleziono.cond, &znaleziono.mutex);
znaleziono.znaleziono--;
cout<<n<<endl;
pthread_mutex_unlock(&znaleziono.mutex);
}
return EXIT_SUCCESS;}
int main()
{
pthread_t id_p;
pthread_t id_k;
pthread_create(&id_p, NULL, producent0, NULL);
pthread_join(id_p, NULL);
pthread_create(&id_k, NULL, konsument, NULL); pthread_join(id_k, NULL);
exit(0);
}