Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <Windows.h>
- #include <time.h>
- #include <conio.h>
- using namespace std;
- #define N_CZYTELNIKOW 5
- #define MAX_CZAS_ZAJECIA_ZASOBU_PRZEZ_CZYTELNIKA 1500
- #define MAX_CZAS_SPANIA_PRZEZ_CZYTELNIKA 1500
- // id pisarzy = N_CZYTELNIKOW + id_pisarza
- #define N_PISARZY 2
- #define MAX_CZAS_ZAJECIA_ZASOBU_PRZEZ_PISARZA 1500
- #define MAX_CZAS_SPANIA_PRZEZ_PISARZA 1500
- vector<int> zasob;
- CRITICAL_SECTION zasob_cs;
- DWORD WINAPI Czytelnik( LPVOID lpParam )
- {
- Sleep(rand() % 3000);
- int id = (int) lpParam;
- bool w_czytelni = false;
- int czas_zajecia = 0;
- int czas_spania = 0;
- printf("Melduje sie czytelnik: %d\n", id);
- while(1)
- {
- if (!w_czytelni)
- {
- EnterCriticalSection(&zasob_cs);
- bool zajete = false;
- for(int i=0; i<zasob.size(); i++)
- {
- if (zasob[i] >= N_CZYTELNIKOW)
- {
- zajete = true;
- break;
- }
- }
- if (!zajete)
- {
- zasob.push_back(id);
- w_czytelni = true;
- printf("Czytelnik %d wszedl do bilbioteki, czas spania: %d\n", id, czas_spania);
- }
- LeaveCriticalSection(&zasob_cs);
- }
- else
- {
- srand(((int)&id) + id + czas_zajecia + czas_spania);
- czas_zajecia = rand() % MAX_CZAS_ZAJECIA_ZASOBU_PRZEZ_PISARZA;
- czas_spania = rand() % MAX_CZAS_SPANIA_PRZEZ_PISARZA;
- Sleep( czas_zajecia ); // czas zajecia zasobu
- EnterCriticalSection(&zasob_cs);
- for(int i=0; i<zasob.size(); i++)
- {
- if (zasob[i] == id)
- {
- zasob.erase(zasob.begin() + i);
- w_czytelni = false;
- printf("Czytelnik %d wyszedl z bilbioteki, czas zajecia: %d\n", id, czas_zajecia);
- break;
- }
- }
- LeaveCriticalSection(&zasob_cs);
- Sleep( czas_spania ); // czas nie potrzebowania zasobu
- }
- }
- return 0;
- }
- DWORD WINAPI Pisarz( LPVOID lpParam )
- {
- int id = (int) lpParam;
- bool w_czytelni = false;
- int czas_zajecia = 0;
- int czas_spania = 0;
- printf("Melduje sie pisarz: %d\n", id);
- while(1)
- {
- if (!w_czytelni)
- {
- EnterCriticalSection(&zasob_cs);
- if (zasob.size()==0)
- {
- zasob.push_back(N_CZYTELNIKOW+id);
- w_czytelni = true;
- printf("Pisarz %d wszedl do bilbioteki, czas spania: %d\n", id, czas_spania);
- }
- LeaveCriticalSection(&zasob_cs);
- }
- else
- {
- srand(((int)&id) + id + czas_zajecia + czas_spania);
- czas_zajecia = rand() % MAX_CZAS_ZAJECIA_ZASOBU_PRZEZ_PISARZA;
- czas_spania = rand() % MAX_CZAS_SPANIA_PRZEZ_PISARZA;
- Sleep( czas_zajecia ); // czas zajecia zasobu
- EnterCriticalSection(&zasob_cs);
- for(int i=0; i<zasob.size(); i++)
- {
- if (zasob[i] == id+N_CZYTELNIKOW)
- {
- zasob.erase(zasob.begin() + i);
- w_czytelni = false;
- printf("Pisarz %d wyszedl z bilbioteki, czas zajecia: %d\n", id, czas_zajecia);
- break;
- }
- }
- LeaveCriticalSection(&zasob_cs);
- Sleep( czas_spania ); // czas nie potrzebowania zasobu
- }
- }
- return 0;
- }
- int main()
- {
- srand(time(NULL));
- InitializeCriticalSection(&zasob_cs);
- HANDLE Czytelnicy_H[N_CZYTELNIKOW];
- HANDLE Pisarze_H [N_PISARZY];
- for(int i=0; i<N_CZYTELNIKOW; i++)
- {
- Czytelnicy_H[i] = CreateThread( NULL, 0, Czytelnik, (LPVOID)i, 0, NULL);
- }
- for(int i=0; i<N_PISARZY; i++)
- {
- Pisarze_H[i] = CreateThread( NULL, 0, Pisarz, (LPVOID)i, 0, NULL);
- }
- while(1)
- {
- _getch();
- EnterCriticalSection(&zasob_cs);
- printf("PAUZA [||], zawartosc bilbioteki: ");
- for(int i=0; i<zasob.size(); i++)
- {
- // czytelnik
- if (zasob[i]<N_CZYTELNIKOW)
- {
- printf("C[%d]", zasob[i]);
- }
- else
- {
- printf("P[%d]",zasob[i]-N_CZYTELNIKOW);
- }
- }
- printf("\n");
- _getch();
- LeaveCriticalSection(&zasob_cs);
- printf("KONTYNUACJA [>]\n");
- }
- DeleteCriticalSection(&zasob_cs);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement