Advertisement
Guest User

Untitled

a guest
Jun 20th, 2018
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.23 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() clients 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. code = pthread_join(barberid, NULL);
  124. if(code)
  125. {
  126. fprintf(stderr,"Error -pthread_join() barber return code: %d\n",code);
  127. exit(EXIT_FAILURE)
  128. }
  129. exit(0);
  130. }
  131.  
  132. void *barber(void *param) {
  133. int worktime;
  134. while (!Done) {
  135. //poczekaj na klientów aż będą dostępni
  136. sem_wait(&sem_client);
  137. //poczekaj na dostęp do krzeseł
  138. sem_wait(&chairs_mutex);
  139. //zwiększ liczbę dostępnych krzeseł
  140. num_chairs += 1;
  141. //ustawienie zdjęcie klienta z kolejki i ustawienie go jako w gabiniecie
  142. if (!queue.empty()) {
  143. in = queue.back();
  144. queue.pop_back();
  145. }
  146. std::cout << "Res: " << res.size() << " WRoom: " << queue.size() << "/" << chairs_total << " [in: "
  147. << in << "]"
  148. << std::endl;
  149. if (DebugFlag) {
  150. //Wypisanie klientow w kolejce
  151. std::cout << "Queue size " << queue.size() << std::endl;
  152. if (!queue.empty())
  153. std::cout << "Jej zawartość: " << std::endl;
  154. for (auto el:queue)
  155. std::cout << "Wątek " << el << std::endl;
  156. //Wypisanie klientów którzy zrezygnowali
  157. std::cout << "Res size " << res.size() << std::endl;
  158. if (!res.empty())
  159. std::cout << "Jej zawartość: " << std::endl;
  160. for (auto el2:res)
  161. std::cout << "Wątek: " << el2 << std::endl;
  162. }
  163. //sygnał dla klienta, że fryzjer jest wolny
  164. sem_post(&sem_barber);
  165. //zdjęcie blokady z liczby krzeseł
  166. sem_post(&chairs_mutex);
  167. //generuje losowy czas ścinania włosów od 1 do 4 sec
  168. worktime = (rand() % 4) + 1;
  169. //ścinanie włosów
  170. sleep(worktime);
  171. //ustawienie obecnego clienta na brak
  172. in = 0;
  173. std::cout << "Res: " << res.size() << " WRoom: " << queue.size() << "/" << chairs_total << " [in: "
  174. << in << "]"
  175. << std::endl;
  176. if (DebugFlag) {
  177. //Wypisanie klientow w kolejce
  178. std::cout << "Queue size " << queue.size() << std::endl;
  179. if (!queue.empty())
  180. std::cout << "Jej zawartość: " << std::endl;
  181. for (auto el:queue)
  182. std::cout << "Wątek " << el << std::endl;
  183. //Wypisanie klientów którzy zrezygnowali
  184. std::cout << "Res size " << res.size() << std::endl;
  185. if (!res.empty())
  186. std::cout << "Jej zawartość: " << std::endl;
  187. for (auto el2:res)
  188. std::cout << "Wątek: " << el2 << std::endl;
  189. }
  190. }
  191.  
  192. }
  193.  
  194. void *client(void *number) {
  195. int *num = (int *) number;
  196. int waittime;
  197. //losowy czas "dotarcia" do salonu
  198. waittime = (rand() % clientWait) + 1;
  199. sleep(waittime);
  200. //poczekaj na dostęp do liczby krzeseł
  201. sem_wait(&chairs_mutex);
  202. //jeśli nie ma krzeseł
  203. if (num_chairs <= 0) {
  204. //Dodanie do listy nie przyjetych klientow
  205. res.push_back(*num);
  206. std::cout << "Res: " << res.size() << " WRoom: " << queue.size() << "/" << chairs_total << " [in: "
  207. << in
  208. << "]" << std::endl;
  209. if (DebugFlag) {
  210. //Wypisanie klientow w kolejce
  211. std::cout << "Queue size " << queue.size() << std::endl;
  212. if (!queue.empty())
  213. std::cout << "Jej zawartość: " << std::endl;
  214. for (auto el:queue)
  215. std::cout << "Wątek " << el << std::endl;
  216. //Wypisanie klientów którzy zrezygnowali
  217. std::cout << "Res size " << res.size() << std::endl;
  218. if (!res.empty())
  219. std::cout << "Jej zawartość: " << std::endl;
  220. for (auto el2:res)
  221. std::cout << "Wątek: " << el2 << std::endl;
  222. }
  223. //zdjęcie blokady z krzeseł
  224. sem_post(&chairs_mutex);
  225. } else {
  226. //zmniejsz ilość wolnych miejsc
  227. num_chairs -= 1;
  228. //Dodanie do kolejki
  229. queue.push_back(*num);
  230. std::cout << "Res: " << res.size() << " WRoom: " << queue.size() << "/" << chairs_total << " [in: "
  231. << in
  232. << "]" << std::endl;
  233. if (DebugFlag) {
  234. //Wypisanie klientow w kolejce
  235. std::cout << "Queue size " << queue.size() << std::endl;
  236. if (!queue.empty())
  237. std::cout << "Jej zawartość: " << std::endl;
  238. for (auto el:queue)
  239. std::cout << "Wątek " << el << std::endl;
  240. //Wypisanie klientów którzy zrezygnowali
  241. std::cout << "Res size " << res.size() << std::endl;
  242. if (!res.empty())
  243. std::cout << "Jej zawartość: " << std::endl;
  244. for (auto el2:res)
  245. std::cout << "Wątek: " << el2 << std::endl;
  246. }
  247. //sygnał, że klient jest gotowy
  248. sem_post(&sem_client);
  249. //zdjęcie blokady z krzeseł
  250. sem_post(&chairs_mutex);
  251. //czekanie na fryzjera
  252. sem_wait(&sem_barber);
  253. }
  254.  
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement