Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Data je klasa Message_box koja predstavlja sanduce za poruke bilo kojeg tipa.
- Message_box sadrzi dve metode:
- send(const MESSAGE* message) - za ubacivanje poruke u sanduce i
- receive() - za preuzimanje poruke iz sanduceta
- Date su niti proizvodjac i potrosac.
- Nit proizvodjac ubacuje tri poruke u sanduce, a nit potrosac ih preuzima i ispisuje.
- Prepraviti klasu tako da bude implementirana u skladu sa sledecim pravilima:
- - Nit proizvodjac ne sme da upie novu poruku, dok nit potrosac ne preuzme prethodno upisanu poruku.
- - Nit potrosac ne sme da preuzme poruku pre nego to je nit proizvodjac upie.
- - Nit potrosac ne sme dva puta da preuzme istu poruku.
- (Ili koricenjem stanja:
- Nit proizvodjac ne sme da pie u punu deljenu promenljivu.
- Nit potrosac ne sme da cita iz prazne deljene promenljive.)
- Ako program ispravno radi, sve tri poruke trebaju biti preuzete i ispisane, tako da ispis bude:
- 2
- 9
- 7
- */
- #include <thread>
- #include <iostream>
- using namespace std;
- enum S {PRAZNO, PUNO};
- template<class MESSAGE>
- class Message_box {
- MESSAGE content;
- S state;
- mutex m;
- condition_variable c1, c2;
- public:
- Message_box() : state(PRAZNO) {};
- void send(const MESSAGE* message);
- MESSAGE receive();
- };
- template<class MESSAGE>
- void Message_box<MESSAGE>::send(const MESSAGE* message)
- {
- unique_lock<mutex> l(m);
- while (state == PUNO) {
- c1.wait(l);
- }
- content = *message;
- state = PUNO;
- c2.notify_one();
- }
- template<class MESSAGE>
- MESSAGE Message_box<MESSAGE>::receive()
- {
- unique_lock<mutex> l(m);
- while (state == PRAZNO) {
- c2.wait(l);
- }
- c1.notify_one();
- state = PRAZNO;
- return content;
- }
- void proizvodjac(Message_box<int>& mb) {
- int a = 2;
- mb.send(&a);
- a = 9;
- mb.send(&a);
- a = 7;
- mb.send(&a);
- }
- void potrosac(Message_box<int>& mb) {
- cout << "Preuzeto: " << mb.receive() << endl;
- cout << "Preuzeto: " << mb.receive() << endl;
- cout << "Preuzeto: " << mb.receive() << endl;
- }
- int main() {
- Message_box<int> mb;
- thread t1(proizvodjac, ref(mb));
- thread t2(potrosac, ref(mb));
- t1.join();
- t2.join();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement