Advertisement
Guest User

Untitled

a guest
May 27th, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.21 KB | None | 0 0
  1. /*
  2.     Problem czytelnikow i pisarzy
  3.     Readers writers problem
  4.     Autor: Jakub Bełdyk
  5. */
  6. #include "monitor.h"
  7. #include <iostream>
  8.  
  9. #define CZYTELNICY 2
  10. #define PISARZE 4
  11.  
  12. class Czytelnia : public Monitor
  13. {
  14.     public:
  15.    
  16.         Czytelnia() : pisarzPisze( false),
  17.                       ileCzyt(0),
  18.                       ilePis(0) {}
  19.    
  20.         void rozpoczecieCzytania()
  21.         {
  22.             enter();
  23.            
  24.             if( ilePis>0 || pisarzPisze)
  25.                 wait(czytanie);
  26.                
  27.             ileCzyt++;
  28.             signal(czytanie);
  29.            
  30.             leave();
  31.         }
  32.        
  33.         void zakonczenieCzytania()
  34.         {
  35.             enter();
  36.            
  37.             ileCzyt--;
  38.            
  39.             if( ileCzyt==0)
  40.                 signal(pisanie);
  41.            
  42.             leave();
  43.         }
  44.        
  45.         void rozpoczeciePisania()
  46.         {
  47.             enter();
  48.            
  49.             if( pisarzPisze || ileCzyt > 0)
  50.             {
  51.        
  52.                 ilePis++;
  53.                 wait(pisanie);
  54.                 ilePis--;
  55.             }
  56.            
  57.             pisarzPisze = true;
  58.            
  59.             leave();
  60.         }
  61.        
  62.         void zakonczeniePisania()
  63.         {
  64.            
  65.             enter();
  66.            
  67.             pisarzPisze = false;
  68.            
  69.             if( ilePis==0)
  70.                 signal(czytanie);
  71.            
  72.             if( ilePis>0)
  73.                 signal(pisanie);
  74.            
  75.             leave();       
  76.         }
  77.     private:
  78.         int ileCzyt;
  79.         int ilePis;
  80.         Condition czytanie, pisanie;
  81.         bool pisarzPisze;
  82. };
  83.  
  84. Czytelnia czytelnia;
  85.  
  86. void * czytelnik( void * id)
  87. {
  88.  
  89.     while(1)
  90.     {
  91.         printf("Pojawil sie czytelnik nr: %d\n", *((int *) id));
  92.    
  93.    
  94.         czytelnia.rozpoczecieCzytania();
  95.         printf("Poczatek czytania, czytelnik nr: %d\n", *((int *) id));
  96.        
  97.         // Czytanie
  98.         sleep(3);
  99.        
  100.         printf("Koniec czytania, czytelnik nr: %d\n", *((int *) id));
  101.         czytelnia.zakonczenieCzytania();
  102.        
  103.     }
  104. }
  105.  
  106. void * pisarz( void * id)
  107. {
  108.     while(1)
  109.     {
  110.    
  111.         printf("Pojawil sie pisarz nr: %d\n", *((int *) id));
  112.        
  113.        
  114.         czytelnia.rozpoczeciePisania();
  115.         printf("Poczatek pisania, pisarz nr: %d\n", *((int *) id));
  116.        
  117.         // Pisanie
  118.         sleep(4);
  119.        
  120.            
  121.         printf("Koniec pisania, pisarz nr: %d\n", *(int *) id);
  122.         czytelnia.zakonczeniePisania();
  123.        
  124.         sleep(20);
  125.        
  126.     }
  127. }
  128.  
  129. int main()
  130. {
  131.     pthread_t czyt[CZYTELNICY ];
  132.     pthread_t pis[PISARZE ];
  133.  
  134.  
  135.     for( int i=0; i<PISARZE; i++)
  136.         pthread_create(&(pis[i]), NULL, pisarz, new int(i) );
  137.    
  138.     for( int i=0; i<CZYTELNICY; i++)
  139.         pthread_create(&(czyt[i]), NULL, czytelnik, new int(i) );  
  140.        
  141.     for( int i=0; i<PISARZE; i++)
  142.         pthread_join(pis[i], (void**)NULL);
  143.        
  144.     return 0;
  145.  
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement