Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Problem czytelnikow i pisarzy
- Readers writers problem
- Autor: Jakub Bełdyk
- */
- #include "monitor.h"
- #include <iostream>
- #define CZYTELNICY 2
- #define PISARZE 4
- class Czytelnia : public Monitor
- {
- public:
- Czytelnia() : pisarzPisze( false),
- ileCzyt(0),
- ilePis(0) {}
- void rozpoczecieCzytania()
- {
- enter();
- if( ilePis>0 || pisarzPisze)
- wait(czytanie);
- ileCzyt++;
- signal(czytanie);
- leave();
- }
- void zakonczenieCzytania()
- {
- enter();
- ileCzyt--;
- if( ileCzyt==0)
- signal(pisanie);
- leave();
- }
- void rozpoczeciePisania()
- {
- enter();
- if( pisarzPisze || ileCzyt > 0)
- {
- ilePis++;
- wait(pisanie);
- ilePis--;
- }
- pisarzPisze = true;
- leave();
- }
- void zakonczeniePisania()
- {
- enter();
- pisarzPisze = false;
- if( ilePis==0)
- signal(czytanie);
- if( ilePis>0)
- signal(pisanie);
- leave();
- }
- private:
- int ileCzyt;
- int ilePis;
- Condition czytanie, pisanie;
- bool pisarzPisze;
- };
- Czytelnia czytelnia;
- void * czytelnik( void * id)
- {
- while(1)
- {
- printf("Pojawil sie czytelnik nr: %d\n", *((int *) id));
- czytelnia.rozpoczecieCzytania();
- printf("Poczatek czytania, czytelnik nr: %d\n", *((int *) id));
- // Czytanie
- sleep(3);
- printf("Koniec czytania, czytelnik nr: %d\n", *((int *) id));
- czytelnia.zakonczenieCzytania();
- }
- }
- void * pisarz( void * id)
- {
- while(1)
- {
- printf("Pojawil sie pisarz nr: %d\n", *((int *) id));
- czytelnia.rozpoczeciePisania();
- printf("Poczatek pisania, pisarz nr: %d\n", *((int *) id));
- // Pisanie
- sleep(4);
- printf("Koniec pisania, pisarz nr: %d\n", *(int *) id);
- czytelnia.zakonczeniePisania();
- sleep(20);
- }
- }
- int main()
- {
- pthread_t czyt[CZYTELNICY ];
- pthread_t pis[PISARZE ];
- for( int i=0; i<PISARZE; i++)
- pthread_create(&(pis[i]), NULL, pisarz, new int(i) );
- for( int i=0; i<CZYTELNICY; i++)
- pthread_create(&(czyt[i]), NULL, czytelnik, new int(i) );
- for( int i=0; i<PISARZE; i++)
- pthread_join(pis[i], (void**)NULL);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement