Advertisement
hugol

Untitled

May 31st, 2015
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. #include <Windows.h>
  5. #include <time.h>
  6.  
  7.  
  8. using namespace std;
  9.  
  10. #define N_CZYTELNIKOW 5
  11. #define MAX_CZAS_ZAJECIA_ZASOBU_PRZEZ_CZYTELNIKA 5000
  12. #define MAX_CZAS_SPANIA_PRZEZ_CZYTELNIKA 5000
  13. // id pisarzy = N_CZYTELNIKOW + id_pisarza
  14. #define N_PISARZY 2
  15. #define MAX_CZAS_ZAJECIA_ZASOBU_PRZEZ_PISARZA 5000
  16. #define MAX_CZAS_SPANIA_PRZEZ_PISARZA 5000
  17. vector<int> zasob;
  18. CRITICAL_SECTION zasob_cs;
  19. CRITICAL_SECTION rand_cs;
  20.  
  21. DWORD WINAPI Czytelnik( LPVOID lpParam )
  22. {
  23.     Sleep(rand() % 3000);
  24.    
  25.     int id = (int) lpParam;
  26.     bool w_czytelni = false;
  27.     int czas_zajecia = 0;
  28.     int czas_spania = 0;
  29.     printf("Melduje sie czytelnik: %d\n", id);
  30.     while(1)
  31.     {
  32.  
  33.         if (!w_czytelni)
  34.         {
  35.             EnterCriticalSection(&zasob_cs);
  36.             bool zajete = false;
  37.             for(int i=0; i<zasob.size(); i++)
  38.             {
  39.                 if (zasob[i] >= N_CZYTELNIKOW)
  40.                 {
  41.                     zajete = true;
  42.  
  43.                     break;
  44.                 }
  45.             }
  46.             if (!zajete)
  47.             {
  48.                 zasob.push_back(id);
  49.                 w_czytelni = true;
  50.                 printf("Czytelnik %d wszedl do bilbioteki, czas spania: %d\n", id, czas_spania);
  51.             }
  52.             LeaveCriticalSection(&zasob_cs);
  53.         }
  54.         else
  55.         {  
  56.            
  57.             srand(((int)&id) + id + czas_zajecia + czas_spania);
  58.             czas_zajecia = rand() % MAX_CZAS_ZAJECIA_ZASOBU_PRZEZ_PISARZA;
  59.             czas_spania  = rand() % MAX_CZAS_SPANIA_PRZEZ_PISARZA;
  60.  
  61.             Sleep( czas_zajecia ); // czas zajecia zasobu
  62.             EnterCriticalSection(&zasob_cs);
  63.             for(int i=0; i<zasob.size(); i++)
  64.             {
  65.                 if (zasob[i] == id)
  66.                 {
  67.                     zasob.erase(zasob.begin() + i);
  68.                     w_czytelni = false;
  69.                     printf("Czytelnik %d wyszedl z bilbioteki, czas zajecia: %d\n", id, czas_zajecia);
  70.                     break;
  71.                 }
  72.             }
  73.             LeaveCriticalSection(&zasob_cs);
  74.             Sleep( czas_spania ); // czas nie potrzebowania zasobu
  75.         }
  76.     }
  77.  
  78.     return 0;
  79. }
  80.  
  81. DWORD WINAPI Pisarz( LPVOID lpParam )
  82. {
  83.     int id = (int) lpParam;
  84.     bool w_czytelni = false;
  85.     int czas_zajecia = 0;
  86.     int czas_spania = 0;
  87.     printf("Melduje sie pisarz: %d\n", id);
  88.     while(1)
  89.     {
  90.         if (!w_czytelni)
  91.         {
  92.             EnterCriticalSection(&zasob_cs);
  93.  
  94.             if (zasob.size()==0)
  95.             {
  96.                 zasob.push_back(N_CZYTELNIKOW+id);
  97.                 w_czytelni = true;
  98.                 printf("Pisarz %d wszedl do bilbioteki, czas spania: %d\n", id, czas_spania);
  99.             }
  100.             LeaveCriticalSection(&zasob_cs);
  101.         }
  102.         else
  103.         {
  104.             srand(((int)&id) + id + czas_zajecia + czas_spania);
  105.             czas_zajecia = rand() % MAX_CZAS_ZAJECIA_ZASOBU_PRZEZ_PISARZA;
  106.             czas_spania  = rand() % MAX_CZAS_SPANIA_PRZEZ_PISARZA;
  107.            
  108.  
  109.             Sleep( czas_zajecia ); // czas zajecia zasobu
  110.             EnterCriticalSection(&zasob_cs);
  111.             for(int i=0; i<zasob.size(); i++)
  112.             {
  113.                 if (zasob[i] == id+N_CZYTELNIKOW)
  114.                 {
  115.                     zasob.erase(zasob.begin() + i);
  116.                     w_czytelni = false;
  117.                     printf("Pisarz %d wyszedl z bilbioteki, czas zajecia: %d\n", id, czas_zajecia);
  118.                     break;
  119.                 }
  120.             }
  121.             LeaveCriticalSection(&zasob_cs);
  122.             Sleep( czas_spania ); // czas nie potrzebowania zasobu
  123.         }
  124.     }
  125.  
  126.     return 0;
  127. }
  128.  
  129. int main()
  130. {
  131.     srand(time(NULL));
  132.     InitializeCriticalSection(&rand_cs);
  133.     InitializeCriticalSection(&zasob_cs);
  134.  
  135.     HANDLE Czytelnicy_H[N_CZYTELNIKOW];
  136.     HANDLE Pisarze_H   [N_PISARZY];
  137.  
  138.     for(int i=0; i<N_CZYTELNIKOW; i++)
  139.     {
  140.         Czytelnicy_H[i] = CreateThread( NULL, 0, Czytelnik, (LPVOID)i, 0, NULL);
  141.     }
  142.  
  143.     for(int i=0; i<N_PISARZY; i++)
  144.     {
  145.         Pisarze_H[i] = CreateThread( NULL, 0, Pisarz, (LPVOID)i, 0, NULL);
  146.     }
  147.  
  148.     Sleep(100000);
  149.  
  150.     DeleteCriticalSection(&zasob_cs);
  151.     DeleteCriticalSection(&rand_cs);
  152.     return 0;
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement