Advertisement
hugol

Untitled

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