Advertisement
Guest User

Untitled

a guest
May 20th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.17 KB | None | 0 0
  1. #include <pthread.h>
  2. #include <stdio.h>
  3.  
  4. int N;
  5.  
  6. int leweMiasto;
  7. int praweMiasto;
  8.  
  9. int kolejkaPoLewejStronie;
  10. int kolejkaPoPrawejStronie;
  11.  
  12. pthread_mutex_t most;
  13.  
  14. int samochodNaMoscie;
  15.  
  16. int *nrSamochoduIJegoMiasto;
  17.  
  18. pthread_t *samochod;
  19.  
  20. pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
  21.  
  22. void czekanieWMiescie()
  23. {
  24. printf("CZEKANIE W MIESCIE\n");
  25. printf("A-%d %d>>>[]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, kolejkaPoPrawejStronie, praweMiasto);
  26. sleep(20);
  27.  
  28. }
  29.  
  30. void *przejazdMostemZmienneWarunkowe(int numerSamochodu)
  31. {
  32. pthread_mutex_lock(&most);
  33. printf("JEDZIE\n");
  34. if (nrSamochoduIJegoMiasto[numerSamochodu] == 0)
  35. {
  36. kolejkaPoLewejStronie--;
  37. printf("A-%d %d>>>[>>%d>>]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, numerSamochodu, kolejkaPoPrawejStronie, praweMiasto);
  38. samochodNaMoscie = numerSamochodu;
  39. sleep(5);
  40. nrSamochoduIJegoMiasto[numerSamochodu] = 1;
  41. praweMiasto++;
  42. }
  43. else
  44. {
  45. kolejkaPoPrawejStronie--;
  46. printf("A-%d %d>>>[<<%d<<]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, numerSamochodu, kolejkaPoPrawejStronie, praweMiasto);
  47. samochodNaMoscie = numerSamochodu;
  48. sleep(5);
  49. nrSamochoduIJegoMiasto[numerSamochodu] = 0;
  50. leweMiasto++;
  51. }
  52.  
  53. pthread_mutex_unlock(&most);
  54. printf("MOST ODBLOKOWANY\n");
  55. pthread_cond_signal(&cond);
  56.  
  57. }
  58.  
  59. void *jazdaDoDrugiegoMiastaZW(void *numerSamochodu)
  60. {
  61. while (1)
  62. {
  63. int n = (int)numerSamochodu;
  64. if (nrSamochoduIJegoMiasto[n] == 0)
  65. {
  66. leweMiasto--;
  67. kolejkaPoLewejStronie++;
  68. printf("A-%d %d>>>[]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, kolejkaPoPrawejStronie, praweMiasto);
  69. }
  70. else
  71. {
  72. praweMiasto--;
  73. kolejkaPoPrawejStronie++;
  74. printf("A-%d %d>>>[]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, kolejkaPoPrawejStronie, praweMiasto);
  75. }
  76.  
  77. if (samochodNaMoscie == -1)
  78. {
  79. przejazdMostemZmienneWarunkowe(numerSamochodu);
  80. czekanieWMiescie();
  81. }
  82. else
  83. {
  84. pthread_cond_wait(&cond, &most);
  85. printf("OBUDZIL SIE\n");
  86. przejazdMostemZmienneWarunkowe(numerSamochodu);
  87. czekanieWMiescie();
  88. }
  89.  
  90.  
  91. }
  92. }
  93.  
  94. // Sposob bez zmiennych warunkowych.
  95.  
  96. void *przejazdMostem(int numerSamochodu)
  97. {
  98. pthread_mutex_lock(&most);
  99. if (nrSamochoduIJegoMiasto[numerSamochodu] == 0)
  100. {
  101. kolejkaPoLewejStronie--;
  102. printf("A-%d %d>>>[>>%d>>]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, numerSamochodu, kolejkaPoPrawejStronie, praweMiasto);
  103. sleep(5);
  104. nrSamochoduIJegoMiasto[numerSamochodu] = 1;
  105. }
  106. else
  107. {
  108. kolejkaPoPrawejStronie--;
  109. printf("A-%d %d>>>[<<%d<<]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, numerSamochodu, kolejkaPoPrawejStronie, praweMiasto);
  110. sleep(5);
  111. nrSamochoduIJegoMiasto[numerSamochodu] = 0;
  112. }
  113.  
  114. pthread_mutex_unlock(&most);
  115. }
  116.  
  117. void *jazdaDoDrugiegoMiasta(void *numerSamochodu)
  118. {
  119. while (1)
  120. {
  121. int n = (int)numerSamochodu;
  122. if (nrSamochoduIJegoMiasto[n] == 0)
  123. {
  124. kolejkaPoLewejStronie++;
  125. leweMiasto++;
  126. printf("A-%d %d>>>[]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, kolejkaPoPrawejStronie, praweMiasto);
  127. przejazdMostem(numerSamochodu);
  128. praweMiasto++;
  129. printf("A-%d %d>>>[]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, kolejkaPoPrawejStronie, praweMiasto);
  130. czekanieWMiescie();
  131. }
  132. else
  133. {
  134. kolejkaPoPrawejStronie++;
  135. praweMiasto--;
  136. printf("A-%d %d>>>[]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, kolejkaPoPrawejStronie, praweMiasto);
  137. przejazdMostem(numerSamochodu);
  138. leweMiasto++;
  139. printf("A-%d %d>>>[]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, kolejkaPoPrawejStronie, praweMiasto);
  140. czekanieWMiescie();
  141. }
  142. }
  143. }
  144.  
  145. int main(int argc, char *argv[])
  146. {
  147.  
  148. if (atoi(argv[1]) > 0)
  149. {
  150. N = atoi(argv[1]);
  151. }
  152. else
  153. {
  154. printf("Zly parametr\n");
  155. }
  156.  
  157. int numerRozwiazania = 0;
  158.  
  159. if (argc > 2)
  160. {
  161. numerRozwiazania = atoi(argv[2]);
  162. }
  163.  
  164. //pthread_t samochod[N];
  165. samochod = malloc(sizeof(pthread_t) * N);
  166. leweMiasto = N;
  167. int i;
  168.  
  169. nrSamochoduIJegoMiasto = malloc(sizeof(int) * N);
  170.  
  171. pthread_mutex_init(&most, NULL);
  172.  
  173. printf("A-%d 0>>>[]<<<0 0-B\n", N);
  174. switch (numerRozwiazania)
  175. {
  176. case 2:
  177. samochodNaMoscie = -1;
  178.  
  179. for (i = 0; i < N; i++)
  180. pthread_create(&samochod[i], NULL, jazdaDoDrugiegoMiastaZW, (void *)i);
  181. for (i = 0; i < N; i++)
  182. pthread_join(samochod[i], NULL);
  183.  
  184. break;
  185.  
  186. default:
  187.  
  188. for (i = 0; i < N; i++)
  189. pthread_create(&samochod[i], NULL, jazdaDoDrugiegoMiasta, (void *)i);
  190. for (i = 0; i < N; i++)
  191. pthread_join(samochod[i], NULL);
  192. }
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement