daily pastebin goal
2%
SHARE
TWEET

Untitled

a guest Jun 20th, 2018 46 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <getopt.h>
  3. #include <list>
  4. #include <queue>
  5. #include <semaphore.h>
  6. #include <zconf.h>
  7. #include <cstdlib>
  8.  
  9. //using namespace std;
  10.  
  11. #define MAX 20 //max klientow
  12.  
  13. void *client(void *param);
  14.  
  15. void *barber(void *number);
  16.  
  17. sem_t chairs_mutex;
  18. sem_t sem_client;
  19. sem_t sem_barber;
  20. int Clients = 0;
  21. int num_chairs = 0;
  22. int clientWait = 2;
  23. int chairs_total;
  24. std::list<int> queue;
  25. std::list<int> res;
  26. int in;
  27. bool DebugFlag = false;
  28.  
  29. bool Done = false;
  30.  
  31. int main(int argc, char **argv) {
  32.     int opt;
  33.     int option_index = 0;
  34.  
  35.     static struct option long_options[] = {
  36.             {"debug", no_argument,       0, 0},
  37.             {"cl",    required_argument, 0, 1},
  38.             {"ch",    required_argument, 0, 2}
  39.     };
  40.  
  41.     //obsluga przelacznikow
  42.     while ((opt = getopt_long_only(argc, argv, "", long_options, &option_index)) != -1) {
  43.         switch (opt) {
  44.             case 0:
  45.                 DebugFlag = true;
  46.                 break;
  47.             case 1:
  48.                 Clients = atoi(optarg);
  49.                 break;
  50.             case 2:
  51.                 num_chairs = atoi(optarg);
  52.                 break;
  53.             case '?':
  54.                 break;
  55.             default:
  56.                 abort();
  57.         }
  58.     }
  59.     int Number[Clients];
  60.     chairs_total = num_chairs;
  61.     int i;
  62.     pthread_t barberid;
  63.  
  64.     for (i = 0; i < Clients; i++) {
  65.         Number[i] = i + 1;
  66.     }
  67.  
  68.     pthread_t clientids[MAX];
  69.  
  70.     //inicjalizacja semaforów i mutexa
  71.     int sem1 = sem_init(&chairs_mutex, 0, 1);
  72.     if(sem1 == -1)
  73.     {
  74.          fprintf(stderr,"Error -sem_init() return code: %d\n",sem1);
  75.          exit(EXIT_FAILURE)
  76.     }
  77.     int sem2 = sem_init(&sem_client, 0, 0);
  78.     if(sem2 == -1)
  79.     {
  80.          fprintf(stderr,"Error -sem_init() return code: %d\n",sem2);
  81.          exit(EXIT_FAILURE)
  82.     }
  83.     int sem3 = sem_init(&sem_barber, 0, 0);
  84.     if(sem3 == -1)
  85.     {
  86.          fprintf(stderr,"Error -sem_init() return code: %d\n",sem3);
  87.          exit(EXIT_FAILURE)
  88.     }
  89.     int code = 0;
  90.     //tworzenie wątku fryzjera
  91.     code = pthread_create(&barberid, NULL, barber, NULL);
  92.     if(code)
  93.         {
  94.             fprintf(stderr,"Error -pthread_create() Barber return code: %d\n",code);
  95.             exit(EXIT_FAILURE)
  96.         }
  97.     //twadzenie wątku klientów
  98.     for (i = 0; i < Clients; i++) {
  99.         code = pthread_create(&clientids[i], NULL, client, &Number[i]);
  100.         if(code)
  101.         {
  102.             fprintf(stderr,"Error -pthread_create() Clients return code: %d\n",code);
  103.             exit(EXIT_FAILURE)
  104.         }
  105.        
  106.  
  107.     }
  108.     //Dodanie joina dla każdego wątku klienta aby czekał na jego zakończenie
  109.     for (int j = 0; j < Clients; ++j) {
  110.         code = pthread_join(clientids[j], NULL);
  111.         if(code)
  112.         {
  113.             fprintf(stderr,"Error -pthread_join()  return code: %d\n",code);
  114.             exit(EXIT_FAILURE)
  115.         }
  116.     }
  117.  
  118.     //Wszystkie watki klientow przerobione
  119.     Done = true;
  120.     //Wybudzenie fryzjera
  121.     sem_post(&sem_barber);
  122.     //Poczekanie aż wątek fryzjera się skończy
  123.     pthread_join(barberid, NULL);
  124.     exit(0);
  125. }
  126.  
  127. void *barber(void *param) {
  128.     int worktime;
  129.     while (!Done) {
  130.         //poczekaj na klientów aż będą dostępni
  131.         sem_wait(&sem_client);
  132.         //poczekaj na dostęp do krzeseł
  133.         sem_wait(&chairs_mutex);
  134.         //zwiększ liczbę dostępnych krzeseł
  135.         num_chairs += 1;
  136.         //ustawienie zdjęcie klienta z kolejki i ustawienie go jako w gabiniecie
  137.         if (!queue.empty()) {
  138.             in = queue.back();
  139.             queue.pop_back();
  140.         }
  141.         std::cout << "Res: " << res.size() << " WRoom: " << queue.size() << "/" << chairs_total << " [in: "
  142.                   << in << "]"
  143.                   << std::endl;
  144.         if (DebugFlag) {
  145.             //Wypisanie klientow w kolejce
  146.             std::cout << "Queue size " << queue.size() << std::endl;
  147.             if (!queue.empty())
  148.                 std::cout << "Jej zawartość: " << std::endl;
  149.             for (auto el:queue)
  150.                 std::cout << "Wątek " << el << std::endl;
  151.             //Wypisanie klientów którzy zrezygnowali
  152.             std::cout << "Res size " << res.size() << std::endl;
  153.             if (!res.empty())
  154.                 std::cout << "Jej zawartość: " << std::endl;
  155.             for (auto el2:res)
  156.                 std::cout << "Wątek: " << el2 << std::endl;
  157.         }
  158.         //sygnał dla klienta, że fryzjer jest wolny
  159.         sem_post(&sem_barber);
  160.         //zdjęcie blokady z liczby krzeseł
  161.         sem_post(&chairs_mutex);
  162.         //generuje losowy czas ścinania włosów od 1 do 4 sec
  163.         worktime = (rand() % 4) + 1;
  164.         //ścinanie włosów
  165.         sleep(worktime);
  166.         //ustawienie obecnego clienta na brak
  167.         in = 0;
  168.         std::cout << "Res: " << res.size() << " WRoom: " << queue.size() << "/" << chairs_total << " [in: "
  169.                   << in << "]"
  170.                   << std::endl;
  171.         if (DebugFlag) {
  172.             //Wypisanie klientow w kolejce
  173.             std::cout << "Queue size " << queue.size() << std::endl;
  174.             if (!queue.empty())
  175.                 std::cout << "Jej zawartość: " << std::endl;
  176.             for (auto el:queue)
  177.                 std::cout << "Wątek " << el << std::endl;
  178.             //Wypisanie klientów którzy zrezygnowali
  179.             std::cout << "Res size " << res.size() << std::endl;
  180.             if (!res.empty())
  181.                 std::cout << "Jej zawartość: " << std::endl;
  182.             for (auto el2:res)
  183.                 std::cout << "Wątek: " << el2 << std::endl;
  184.         }
  185.     }
  186.  
  187. }
  188.  
  189. void *client(void *number) {
  190.     int *num = (int *) number;
  191.     int waittime;
  192.     //losowy czas "dotarcia" do salonu
  193.     waittime = (rand() % clientWait) + 1;
  194.     sleep(waittime);
  195.     //poczekaj na dostęp do liczby krzeseł
  196.     sem_wait(&chairs_mutex);
  197.     //jeśli nie ma krzeseł
  198.     if (num_chairs <= 0) {
  199.         //Dodanie do listy nie przyjetych klientow
  200.         res.push_back(*num);
  201.         std::cout << "Res: " << res.size() << " WRoom: " << queue.size() << "/" << chairs_total << " [in: "
  202.                   << in
  203.                   << "]" << std::endl;
  204.         if (DebugFlag) {
  205.             //Wypisanie klientow w kolejce
  206.             std::cout << "Queue size " << queue.size() << std::endl;
  207.             if (!queue.empty())
  208.                 std::cout << "Jej zawartość: " << std::endl;
  209.             for (auto el:queue)
  210.                 std::cout << "Wątek " << el << std::endl;
  211.             //Wypisanie klientów którzy zrezygnowali
  212.             std::cout << "Res size " << res.size() << std::endl;
  213.             if (!res.empty())
  214.                 std::cout << "Jej zawartość: " << std::endl;
  215.             for (auto el2:res)
  216.                 std::cout << "Wątek: " << el2 << std::endl;
  217.         }
  218.         //zdjęcie blokady z krzeseł
  219.         sem_post(&chairs_mutex);
  220.     } else {
  221.         //zmniejsz ilość wolnych miejsc
  222.         num_chairs -= 1;
  223.         //Dodanie do kolejki
  224.         queue.push_back(*num);
  225.         std::cout << "Res: " << res.size() << " WRoom: " << queue.size() << "/" << chairs_total << " [in: "
  226.                   << in
  227.                   << "]" << std::endl;
  228.         if (DebugFlag) {
  229.             //Wypisanie klientow w kolejce
  230.             std::cout << "Queue size " << queue.size() << std::endl;
  231.             if (!queue.empty())
  232.                 std::cout << "Jej zawartość: " << std::endl;
  233.             for (auto el:queue)
  234.                 std::cout << "Wątek " << el << std::endl;
  235.             //Wypisanie klientów którzy zrezygnowali
  236.             std::cout << "Res size " << res.size() << std::endl;
  237.             if (!res.empty())
  238.                 std::cout << "Jej zawartość: " << std::endl;
  239.             for (auto el2:res)
  240.                 std::cout << "Wątek: " << el2 << std::endl;
  241.         }
  242.         //sygnał, że klient jest gotowy
  243.         sem_post(&sem_client);
  244.         //zdjęcie blokady z krzeseł
  245.         sem_post(&chairs_mutex);
  246.         //czekanie na fryzjera
  247.         sem_wait(&sem_barber);
  248.     }
  249.  
  250. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top