Advertisement
Guest User

Untitled

a guest
Jun 21st, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.63 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <pthread.h>
  5. #include <time.h>
  6. #include <unistd.h>
  7.  
  8. pthread_mutex_t mutex;
  9.  
  10. pthread_cond_t cond_czytelnik;
  11. pthread_cond_t cond_pisarz;
  12.  
  13. #define MAX_THREADS 100
  14. pthread_t threadArray[MAX_THREADS];
  15.  
  16. int liczba_czytelnikow_w_czytelni=0;
  17. int liczba_pisarzy_w_czytelni=0;
  18.  
  19. int liczba_pisarzy_w_kolejcje = 0;
  20. int liczba_czytelnikow_w_kolejce = 0;
  21. int debug = 0;
  22. int indexCzytelnia = 0;
  23. int indexKolejka = 0;
  24.  
  25. typedef struct
  26. {
  27. int num;
  28. char rodzaj;
  29. }kolejka;
  30.  
  31. typedef struct ticket_lock {
  32. pthread_cond_t cond;
  33. pthread_mutex_t mutex;
  34. unsigned long queue_head, queue_tail;
  35. } ticket_lock_t;
  36.  
  37. #define TICKET_LOCK_INITIALIZER { PTHREAD_COND_INITIALIZER, PTHREAD_MUTEX_INITIALIZER }
  38.  
  39. void ticket_lock(ticket_lock_t *ticket)
  40. {
  41. unsigned long queue_me;
  42.  
  43. pthread_mutex_lock(&ticket->mutex);
  44. queue_me = ticket->queue_tail++;
  45. while (queue_me != ticket->queue_head)
  46. {
  47. pthread_cond_wait(&ticket->cond, &ticket->mutex);
  48. }
  49. pthread_mutex_unlock(&ticket->mutex);
  50. }
  51.  
  52. void ticket_unlock(ticket_lock_t *ticket)
  53. {
  54. pthread_mutex_lock(&ticket->mutex);
  55. ticket->queue_head++;
  56. pthread_cond_broadcast(&ticket->cond);
  57. pthread_mutex_unlock(&ticket->mutex);
  58. }
  59.  
  60. kolejka tablicaKolejki[100];
  61. kolejka tablicaCzytelni[100];
  62.  
  63. void usun_z_kolejki(int n,char b)
  64. {
  65. kolejka pom;
  66. int a,j=0;
  67.  
  68. for(a=0;a<indexKolejka;a++)
  69. {
  70. if(tablicaKolejki[a].num == n && tablicaKolejki[a].rodzaj == b)
  71. {
  72. pom=tablicaKolejki[a];
  73. j=1;
  74. }
  75.  
  76. if(j)
  77. {
  78. if(a+1 == indexKolejka)
  79. indexKolejka--;
  80. else
  81. tablicaKolejki[a] = tablicaKolejki[a+1];
  82. }
  83. }
  84. tablicaCzytelni[indexCzytelnia]=pom;
  85. indexCzytelnia++;
  86. }
  87.  
  88. void usun_z_czytelni(int n,char b)
  89. {
  90. kolejka pom;
  91. int a,j=0;
  92.  
  93. for(a=0;a<indexCzytelnia;a++)
  94. {
  95. if(tablicaCzytelni[a].num == n && tablicaCzytelni[a].rodzaj == b)
  96. {
  97. pom=tablicaCzytelni[a];
  98. j=1;
  99. }
  100.  
  101. if(j)
  102. {
  103. if(a+1 == indexCzytelnia)
  104. indexCzytelnia--;
  105. else
  106. tablicaCzytelni[a] = tablicaCzytelni[a+1];
  107. }
  108. }
  109. }
  110.  
  111. void dodaj_do_kolejki(int n,char b)
  112. {
  113. kolejka pom;
  114. pom.num=n;
  115. pom.rodzaj=b;
  116. tablicaKolejki[indexKolejka]=pom;
  117. indexKolejka++;
  118. }
  119.  
  120. void drukuj()
  121. {
  122. int i;
  123.  
  124. printf("\n****Kolejka****\n");
  125.  
  126. for(i = 0; i < indexKolejka; i++)
  127. {
  128. if(tablicaKolejki[i].rodzaj == 'c')
  129. printf("Czytelnik %d\n", tablicaKolejki[i].num);
  130. if(tablicaKolejki[i].rodzaj == 'p')
  131. printf("Pisarz %d\n", tablicaKolejki[i].num);
  132. }
  133.  
  134. printf("\n****Czytelnia****\n");
  135.  
  136. for(i = 0;i < indexCzytelnia; i++)
  137. {
  138. if(tablicaCzytelni[i].rodzaj == 'c')
  139. printf("Czytelnik %d\n", tablicaCzytelni[i].num);
  140. if(tablicaCzytelni[i].rodzaj == 'p')
  141. printf("Pisarz %d\n", tablicaCzytelni[i].num);
  142. }
  143. }
  144.  
  145. void *pisarz(void *arg)
  146. {
  147. while(1)
  148. {
  149. pthread_mutex_lock(&mutex);
  150. liczba_pisarzy_w_kolejcje++;
  151.  
  152. //sleep(1);
  153.  
  154. printf("ReaderQ: %d WriterQ: %d [in: R:%d W:%d] (pisarz wchodzi do kolejki)\n",liczba_czytelnikow_w_kolejce,liczba_pisarzy_w_kolejcje,liczba_czytelnikow_w_czytelni,liczba_pisarzy_w_czytelni);
  155. fflush(stdout);
  156. dodaj_do_kolejki((int)arg,'p');
  157.  
  158. if(debug)
  159. drukuj();
  160.  
  161. if(liczba_czytelnikow_w_czytelni > 0 || liczba_pisarzy_w_czytelni > 0 || liczba_czytelnikow_w_kolejce > 0)
  162. pthread_cond_wait(&cond_pisarz, &mutex);
  163.  
  164. printf("obudzono pisarza nr %d\n", (int)arg);
  165.  
  166. liczba_pisarzy_w_czytelni++;
  167. liczba_pisarzy_w_kolejcje--;
  168.  
  169. //sleep(1);
  170.  
  171. printf("ReaderQ: %d WriterQ: %d [in: R:%d W:%d] (pisarz wchodzi do czytelni)\n",liczba_czytelnikow_w_kolejce,liczba_pisarzy_w_kolejcje,liczba_czytelnikow_w_czytelni,liczba_pisarzy_w_czytelni);
  172. fflush(stdout);
  173. usun_z_kolejki((int)arg,'p');
  174.  
  175. if(debug)
  176. drukuj();
  177.  
  178. pthread_mutex_unlock(&mutex);
  179.  
  180. //sleep(1);
  181.  
  182. pthread_mutex_lock(&mutex);
  183. liczba_pisarzy_w_czytelni--;
  184.  
  185. //sleep(1);
  186.  
  187. printf("ReaderQ: %d WriterQ: %d [in: R:%d W:%d] (pisarz wychodzi z czytelni)\n",liczba_czytelnikow_w_kolejce,liczba_pisarzy_w_kolejcje,liczba_czytelnikow_w_czytelni,liczba_pisarzy_w_czytelni);
  188. fflush(stdout);
  189.  
  190. usun_z_czytelni((int)arg,'p');
  191.  
  192. if(debug)
  193. drukuj();
  194. if(liczba_pisarzy_w_czytelni==0)
  195. {
  196. if(tablicaKolejki[0].rodzaj=='c')
  197. {
  198. pthread_cond_signal(&cond_czytelnik);
  199. }
  200. else
  201. {
  202. pthread_cond_signal(&cond_pisarz);
  203. }
  204. }
  205. pthread_mutex_unlock(&mutex);
  206. //sleep(1);
  207. }
  208. }
  209.  
  210. void *czytelnik(void *arg)
  211. {
  212. while(1)
  213. {
  214. pthread_mutex_lock(&mutex);
  215. liczba_czytelnikow_w_kolejce++;
  216.  
  217. //sleep(1);
  218.  
  219. printf("ReaderQ: %d WriterQ: %d [in: R:%d W:%d] (czytelnik wchodzi do kolejki)\n",liczba_czytelnikow_w_kolejce,liczba_pisarzy_w_kolejcje,liczba_czytelnikow_w_czytelni,liczba_pisarzy_w_czytelni);
  220. fflush(stdout);
  221. dodaj_do_kolejki((int)arg,'c');
  222.  
  223. if(debug)
  224. drukuj();
  225.  
  226. if(liczba_pisarzy_w_czytelni > 0 || liczba_pisarzy_w_kolejcje > 0)
  227. pthread_cond_wait(&cond_czytelnik, &mutex);
  228.  
  229. printf("obudzono czytelnika nr %d\n", (int)arg);
  230.  
  231. liczba_czytelnikow_w_czytelni++;
  232. liczba_czytelnikow_w_kolejce--;
  233.  
  234. //sleep(1);
  235.  
  236. printf("ReaderQ: %d WriterQ: %d [in: R:%d W:%d] (czytelnik wchodzi do czytelni)\n",liczba_czytelnikow_w_kolejce,liczba_pisarzy_w_kolejcje,liczba_czytelnikow_w_czytelni,liczba_pisarzy_w_czytelni);
  237. fflush(stdout);
  238. usun_z_kolejki((int)arg,'c');
  239.  
  240. if(debug)
  241. drukuj();
  242.  
  243. if(tablicaKolejki[0].rodzaj=='c')
  244. pthread_cond_signal(&cond_czytelnik);
  245.  
  246. pthread_mutex_unlock(&mutex);
  247.  
  248. //sleep(1);
  249.  
  250. pthread_mutex_lock(&mutex);
  251. liczba_czytelnikow_w_czytelni--;
  252.  
  253. //sleep(1);
  254.  
  255. printf("ReaderQ: %d WriterQ: %d [in: R:%d W:%d] (czytelnik wychodzi z czytelni)\n",liczba_czytelnikow_w_kolejce,liczba_pisarzy_w_kolejcje,liczba_czytelnikow_w_czytelni,liczba_pisarzy_w_czytelni);
  256. fflush(stdout);
  257. usun_z_czytelni((int)arg,'c');
  258.  
  259. if(debug)
  260. drukuj();
  261.  
  262. if(liczba_czytelnikow_w_czytelni == 0)
  263. {
  264. if(tablicaKolejki[0].rodzaj=='p')
  265. {
  266. pthread_cond_signal(&cond_pisarz);
  267. }
  268. else
  269. {
  270. pthread_cond_signal(&cond_czytelnik);
  271. }
  272. }
  273. pthread_mutex_unlock(&mutex);
  274. //sleep(1);
  275. }
  276. }
  277.  
  278. int main(int argc, char *argv[])
  279. {
  280.  
  281. if(argv[3])
  282. if(!strcmp(argv[3],"-debug"))
  283. debug = 1;
  284.  
  285. pthread_mutex_init(&mutex,NULL);
  286. pthread_cond_init(&cond_czytelnik,NULL);
  287. pthread_cond_init(&cond_pisarz,NULL);
  288.  
  289. int i, pom = 0;
  290.  
  291. for (i = 0; i < atoi(argv[1]); i++)
  292. {
  293. pthread_create(&threadArray[pom], NULL, pisarz, (void*)pom);
  294. pom++;
  295. }
  296.  
  297. for (i = 0; i < atoi(argv[2]); i++)
  298. {
  299. pthread_create(&threadArray[pom], NULL, czytelnik, (void*)pom);
  300. pom++;
  301. }
  302.  
  303. for(i=0; i<atoi(argv[1])+atoi(argv[2]); i++)
  304. {
  305. pthread_join(threadArray[i],NULL);
  306. }
  307.  
  308. pthread_cond_destroy(&cond_pisarz);
  309. pthread_cond_destroy(&cond_czytelnik);
  310. pthread_mutex_destroy(&mutex);
  311. return 0;
  312. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement