Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <thread>
- #include <chrono>
- #include <mutex>
- #include <condition_variable>
- #include <random>
- using namespace std;
- const int CZAS_PRACY=5;
- template <typename TypDanych>
- class Monitor
- {
- private:
- TypDanych dane;
- bool saDane;
- mutex mutexDane;
- condition_variable warunekSaNoweDane;
- condition_variable warunekZabranoDane;
- public:
- Monitor()
- {
- saDane=false;
- }
- void zapisz(TypDanych noweDane)
- {
- unique_lock<mutex> blokada(mutexDane);
- if(saDane) warunekZabranoDane.wait(blokada);
- saDane=true;
- dane=noweDane;
- warunekSaNoweDane.notify_one();
- }
- TypDanych odczytaj()
- {
- unique_lock<mutex> blokada(mutexDane);
- if(!saDane) warunekSaNoweDane.wait(blokada);
- saDane=false;
- warunekZabranoDane.notify_one();
- return dane;
- }
- };
- class Producent
- {
- private:
- int czas;
- Monitor< char >& pojemnik;
- char biezacyZnak;
- minstd_rand generator;
- uniform_int_distribution< char > rozklad;
- public:
- int numerp;
- Producent(Monitor < char >& pojemnik,int _numer):
- czas(0), pojemnik(pojemnik), biezacyZnak('a'),
- generator(random_device()()), rozklad('a','z'),numerp(_numer)
- {
- }
- void operator()()
- {
- while (czas<CZAS_PRACY)
- {
- int wylosowana_liczba =( std::rand() % 10 ) + 1;
- pojemnik.zapisz(biezacyZnak);
- biezacyZnak=(biezacyZnak+1-97)%25+97;
- this_thread::sleep_for(chrono::seconds(wylosowana_liczba));
- }
- pojemnik.zapisz(EOF);
- }
- int getnumerp(){
- return numerp
- }
- };
- class Konsument
- {
- private:
- Monitor< char >& pojemnik;
- int numer;
- public:
- Konsument(Monitor< char >& _pojemnik,int _numer): pojemnik(_pojemnik),numer(_numer){}
- void operator()()
- {
- char znak=pojemnik.odczytaj();
- while (znak!=EOF)
- {
- cout<<"Konsument : "<<numer<<" Producent"<<numer<<" generuje --> "<<znak<<endl;
- znak=pojemnik.odczytaj();
- }
- }
- };
- int main()
- {
- random_device r;
- minstd_rand generator(r());
- Monitor< char > pojemnik;
- Konsument konsument(pojemnik,1);
- Konsument konsument2(pojemnik,2);
- Producent producent(pojemnik,1);
- Producent producent2(pojemnik,2);
- thread wk(konsument);
- thread wp(producent);
- thread wk2(konsument2);
- thread wp2(producent2);
- wp.join();
- wk.join();
- wp2.join();
- wk2.join();
- return (EXIT_SUCCESS);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement