Advertisement
Lauda

Untitled

May 27th, 2013
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.64 KB | None | 0 0
  1. /*
  2.     Modelovati web server koji pruza informacije o vremenskoj prognozi.
  3.     Server je predstavljen klasom Server. Server sadrzi podatke o prognoziranoj temperaturi na odredjeni dan, sto
  4.     se prosledjuje u konstruktoru.
  5.  
  6.     Ponasanje klijenata koji pristupaju serveru predstavljeno je datom funkcijom klijent_f.
  7.     Klijent pozivom metode posaljiZahtev salje zahtev serveru za dobijanjem temperature na odredjeni datum
  8.     Datum za koji se temperatura trazi je parametar metode posaljiZahtev. Metoda posaljiZahtev kao rezultat
  9.     vraca prognoziranu temperaturu za prosledjeni datum.
  10.  
  11.     Obradu zahteva vrsi posebna nit predstavljena funkcijom f_server. Ova nit poziva metodu obradiZahtev.
  12.     Serverska nit ceka da se pojavi odredjeni zahtev. Nakon pojave zahteva, server vrsi obradu zahteva.
  13.  
  14.     Klijent i server komuniciraju preko bufera za komunikaciju. Za svaki zahtev otvara se poseban bufer za
  15.     upis zahteva, odnosno odgovora.
  16. */
  17.  
  18. #include <thread>
  19. #include <iostream>
  20. #include <deque>
  21. #include <map>
  22. #include <string>
  23. #include <vector>
  24.  
  25. using namespace std;
  26. using namespace chrono;
  27.  
  28.  
  29. struct Kanal {
  30.     string zahtev;
  31.     string odgovor;
  32.     bool zavrseno;
  33.     condition_variable c;
  34.     Kanal(): zavrseno(false) {}
  35. };
  36.  
  37. struct Vreme {
  38.     string datum;
  39.     string temperatura;
  40.     Vreme() {}
  41.     Vreme(string d, string t): datum(d), temperatura(t) {}
  42. };
  43.  
  44. class Server {
  45.     condition_variable c_naredba;
  46.     mutex m;
  47.     deque<Kanal*> kanali;
  48.     map<string, Vreme> vremenski_uslovi;
  49.     public:
  50.         Server(vector<Vreme> podaci) {
  51.             for (int i = 0; i < podaci.size(); ++i)
  52.                 vremenski_uslovi[podaci[i].datum] = podaci[i];
  53.         }
  54.         string posaljiZahtev(string novi_zahtev) {
  55.             unique_lock<mutex> l(m);
  56.             Kanal* k = new Kanal();
  57.             k->zahtev = novi_zahtev;
  58.             kanali.push_back(k);
  59.             c_naredba.notify_one();
  60.  
  61.             while (!k->zavrseno)
  62.                 k->c.wait(l);
  63.  
  64.             return k->odgovor;
  65.         }
  66.         void obradiZahtev() {
  67.             unique_lock<mutex> l(m);
  68.             while (kanali.empty())
  69.                 c_naredba.wait(l);
  70.  
  71.             Kanal* k = kanali.front();
  72.             kanali.pop_front();
  73.  
  74.             k->odgovor = vremenski_uslovi[k->zahtev].temperatura;
  75.             k->zavrseno = true;
  76.             k->c.notify_one();
  77.         }
  78. };
  79.  
  80. mutex term_mx;
  81. void f_klijent(Server& s, string zahtev, string ip) {
  82.     {
  83.         unique_lock<mutex> l(term_mx);
  84.         cout << "Klijent " << ip << " salje zahtev " << zahtev << endl;
  85.     }
  86.     string odgovor = s.posaljiZahtev(zahtev);
  87.     unique_lock<mutex> l(term_mx);
  88.     cout << "Odgovor klijentu " << ip << " je " << odgovor << endl;
  89. }
  90.  
  91. void f_server(Server& s) {
  92.     while (true) {
  93.         s.obradiZahtev();
  94.     }
  95. }
  96. const int BROJ_KLIJENATA = 5;
  97. int main() {
  98.     string ips[] = {"197.100.100.0","197.100.100.1",
  99.         "197.100.100.2", "197.100.100.3", "197.100.100.4",};
  100.  
  101.     vector<Vreme> v;
  102.     v.push_back(Vreme("01.01.2013", "13"));
  103.     v.push_back(Vreme("02.01.2013", "10"));
  104.     v.push_back(Vreme("03.01.2013", "9"));
  105.     v.push_back(Vreme("04.01.2013", "7"));
  106.     v.push_back(Vreme("05.01.2013", "12"));
  107.  
  108.     string zahtevi[] = {"05.01.2013", "01.01.2013",
  109.         "05.01.2013", "03.01.2013", "03.01.2013"};
  110.  
  111.     Server s(v);
  112.     thread klijenti[BROJ_KLIJENATA];
  113.     thread serverska_nit(f_server, ref(s));
  114.     serverska_nit.detach();
  115.     for (int i = 0; i < BROJ_KLIJENATA; ++i)
  116.         klijenti[i] = thread(f_klijent, ref(s), zahtevi[i], ips[i]);
  117.  
  118.     for (int i = 0; i < BROJ_KLIJENATA; ++i)
  119.         klijenti[i].join();
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement