Wątki - wyświetlanie na bieżąco zmiennej globalnej

Odpowiedz Nowy wątek
2014-12-14 11:48
0

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);
}

Pozostało 580 znaków

2014-12-14 11:59
pthread_create(&id_p, NULL, producent0, NULL); // tworzysz wątek producenta
pthread_join(id_p, NULL); // czekasz w wątku głównym aż wątek producenta się skończy
pthread_create(&id_k, NULL, konsument, NULL); // tworzysz wątek konsumenta
pthread_join(id_k, NULL); // czekasz w wątku głównym aż wątek konsumenta się skończy

Dalej kombinuj sam.

Pozostało 580 znaków

2014-12-14 12:28
0

Już działa. No wiedziałem, że to coś oczywistego będzie, ale kombinowałem i kombinowałem bez rezultatów. ;P Wielkie dzięki za pomoc. :)

Pozostało 580 znaków

2014-12-15 10:01
0

Jeszcze takie jedno pytanie. Gdy kompiluję ten program pojawiaja się ostrzeżenie: "warning: anonymous type with no linkage used to declare variable ‘<anonymous struct="struct"> znaleziono’ with linkage [enabled by default] } znaleziono = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER };" i takie samo do drugiego mutexu. Problem rozwiązuje zmiana struct na static struct, ale nie wiem czy to jest poprawne. Mógłbym liczyć na jakąś podpowiedź lub krótkie wytłumaczenie - dlaczego? Nie mogę znaleźć informacji, które by mi to rozjaśniły.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0