Advertisement
Lauda

msg box

Apr 10th, 2013
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.23 KB | None | 0 0
  1. /*
  2.     Data je klasa Message_box koja predstavlja sanduce za poruke bilo kojeg tipa.
  3.     Message_box sadrzi dve metode:
  4.         send(const MESSAGE* message) - za ubacivanje poruke u sanduce i
  5.         receive() - za preuzimanje poruke iz sanduceta
  6.  
  7.     Date su niti proizvodjac i potrosac.
  8.     Nit proizvodjac ubacuje tri poruke u sanduce, a nit potrosac ih preuzima i ispisuje.
  9.  
  10.     Prepraviti klasu tako da bude implementirana u skladu sa sledecim pravilima:
  11.  
  12.         - Nit proizvodjac ne sme da upiše novu poruku, dok nit potrosac ne preuzme prethodno upisanu poruku.
  13.         - Nit potrosac ne sme da preuzme poruku pre nego što je nit proizvodjac upiše.
  14.         - Nit potrosac ne sme dva puta da preuzme istu poruku.
  15.  
  16.         (Ili korišcenjem stanja:
  17.             Nit proizvodjac ne sme da piše u punu deljenu promenljivu.
  18.             Nit potrosac ne sme da cita iz prazne deljene promenljive.)
  19.  
  20.      Ako program ispravno radi, sve tri poruke trebaju biti preuzete i ispisane, tako da ispis bude:
  21.     2
  22.     9
  23.     7
  24. */
  25.  
  26. #include <thread>
  27. #include <iostream>
  28.  
  29. using namespace std;
  30.  
  31. enum S {PRAZNO, PUNO};
  32.  
  33. template<class MESSAGE>
  34. class Message_box {
  35.     MESSAGE content;
  36.     S state;
  37.     mutex m;
  38.     condition_variable c1, c2;
  39.   public:
  40.     Message_box() : state(PRAZNO) {};
  41.     void send(const MESSAGE* message);
  42.     MESSAGE receive();
  43. };
  44.  
  45. template<class MESSAGE>
  46. void Message_box<MESSAGE>::send(const MESSAGE* message)
  47. {
  48.     unique_lock<mutex> l(m);
  49.     while (state == PUNO) {
  50.         c1.wait(l);
  51.     }
  52.     content = *message;
  53.     state = PUNO;
  54.     c2.notify_one();
  55. }
  56.  
  57. template<class MESSAGE>
  58. MESSAGE Message_box<MESSAGE>::receive()
  59. {
  60.     unique_lock<mutex> l(m);
  61.     while (state == PRAZNO) {
  62.         c2.wait(l);
  63.     }
  64.     c1.notify_one();
  65.     state = PRAZNO;
  66.     return content;
  67.  
  68. }
  69.  
  70. void proizvodjac(Message_box<int>& mb) {
  71.     int a = 2;
  72.     mb.send(&a);
  73.     a = 9;
  74.     mb.send(&a);
  75.     a = 7;
  76.     mb.send(&a);
  77. }
  78.  
  79. void potrosac(Message_box<int>& mb) {
  80.     cout << "Preuzeto: " << mb.receive() << endl;
  81.     cout << "Preuzeto: " << mb.receive() << endl;
  82.     cout << "Preuzeto: " << mb.receive() << endl;
  83. }
  84.  
  85. int main() {
  86.     Message_box<int> mb;
  87.  
  88.     thread t1(proizvodjac, ref(mb));
  89.     thread t2(potrosac, ref(mb));
  90.  
  91.     t1.join();
  92.     t2.join();
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement