Advertisement
Guest User

Untitled

a guest
Jun 20th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.07 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement