ungureanuvladvictor

Untitled

Feb 20th, 2014
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <pthread.h>
  5. #include <semaphore.h>
  6. #include <fcntl.h>
  7. #include <sys/stat.h>
  8. #include <unistd.h>
  9. #include <errno.h>
  10. #include <string.h>
  11.  
  12. char *progname = "bathroom";
  13.  
  14. pthread_t ppl[20];
  15. sem_t *semaphore_m, *semaphore_f, *mutex_boy, *mutex_girl;
  16. sem_t *new_person, *empty;
  17.  
  18. int male_counter = 0;
  19. int female_counter = 0;
  20.  
  21. void shuffle(void *obj, int nmemb, size_t size);
  22. void init_humans(char *humans);
  23. size_t rrand(int m);
  24. void mk_threads(char* people, int n);
  25. void join_threads(int n);
  26. void *run_m(void *arg);
  27. void *run_f(void *arg);
  28. void mk_sem();
  29. void free_sem();
  30. void finish();
  31.  
  32. void init_humans(char *humans) {
  33. int i;
  34.  
  35. for (i = 0; i < 20; ++i)
  36. if (i < 9)
  37. humans[i] = 'm';
  38. else
  39. humans[i] = 'f';
  40. }
  41.  
  42. size_t rrand(int m) {
  43. return (size_t)((double)m * ( rand() / (RAND_MAX+1.0) ));
  44. }
  45.  
  46. #define BYTE(X) ((unsigned char *)(X))
  47. void shuffle(void *obj, int nmemb, size_t size) {
  48. void *temp = malloc(size);
  49. int n = nmemb;
  50. while ( n > 1 ) {
  51. size_t k = rrand(n--);
  52. memcpy(temp, BYTE(obj) + n * size, size);
  53. memcpy(BYTE(obj) + n * size, BYTE(obj) + k * size, size);
  54. memcpy(BYTE(obj) + k * size, temp, size);
  55. }
  56. free(temp);
  57. }
  58.  
  59.  
  60.  
  61. void mk_threads(char* people, int n) {
  62. int i, err;
  63. for (i = 0; i < n; i++) {
  64. if (people[i] == 'm')
  65. err = pthread_create(&ppl[i], NULL, run_m, NULL);
  66. else
  67. err = pthread_create(&ppl[i], NULL, run_f, NULL);
  68.  
  69. if (err) {
  70. fprintf(stderr, "[%s]:[%s]:[%s] - Cannot create thread: %d\n",
  71. progname, __func__, strerror(errno), i);
  72. exit(EXIT_FAILURE);
  73. }
  74. }
  75. }
  76.  
  77. void join_threads(int n) {
  78. int i, err;
  79. for (i = 0; i < n; i++) {
  80. err = pthread_join(ppl[i], NULL);
  81. if(err) {
  82. fprintf(stderr, "[%s]:[%s]:[%s] - Cannot join thread: %d\n",
  83. progname, __func__, strerror(errno), i);
  84. exit(EXIT_FAILURE);
  85. }
  86. }
  87. }
  88.  
  89. void *run_m(void *arg) {
  90.  
  91. sem_wait(new_person);
  92. sem_wait(mutex_boy);
  93. male_counter++;
  94. if (male_counter == 1)
  95. sem_wait(empty);
  96. sem_post(mutex_boy);
  97. sem_wait(semaphore_m);
  98. sem_post(new_person);
  99.  
  100. fprintf(stdout, "Boy in the bathroom\n");
  101.  
  102. usleep(123456 + rand() % 123456);
  103.  
  104. sem_post(semaphore_m);
  105. sem_wait(mutex_boy);
  106.  
  107. male_counter--;
  108.  
  109. if (male_counter == 0)
  110. sem_post(empty);
  111. sem_post(mutex_boy);
  112.  
  113. return NULL;
  114. }
  115.  
  116. void *run_f(void *arg) {
  117.  
  118. sem_wait(new_person);
  119. sem_wait(mutex_girl);
  120. female_counter++;
  121.  
  122. if (female_counter == 1)
  123. sem_wait(empty);
  124.  
  125. sem_post(mutex_girl);
  126. sem_wait(semaphore_f);
  127. sem_post(new_person);
  128.  
  129. fprintf(stdout, "Girl in the bathroom!\n");
  130.  
  131. usleep(123456 + rand() % 123456);
  132.  
  133. sem_post(semaphore_f);
  134. sem_wait(mutex_girl);
  135. female_counter--;
  136.  
  137. if (female_counter == 0)
  138. sem_post(empty);
  139.  
  140. sem_post(mutex_girl);
  141.  
  142. return NULL;
  143. }
  144.  
  145. void mk_sem() {
  146.  
  147. if ((semaphore_m = sem_open("/m", O_CREAT,
  148. 0644, 3)) == SEM_FAILED) {
  149. fprintf(stderr, "[%s]:[%s] - Cannot create semaphore male!\n",
  150. progname, strerror(errno), __func__);
  151. exit(EXIT_FAILURE);
  152. }
  153.  
  154. if ((semaphore_f = sem_open("/f", O_CREAT,
  155. 0644, 3)) == SEM_FAILED) {
  156. fprintf(stderr, "[%s]:[%s] - Cannot create semaphore female!\n",
  157. progname, strerror(errno), __func__);
  158. exit(EXIT_FAILURE);
  159. }
  160.  
  161. if ((mutex_boy = sem_open("/mmux", O_CREAT,
  162. 0644, 1)) == SEM_FAILED) {
  163. fprintf(stderr, "[%s]:[%s] - Cannot create semaphore malemutex!\n",
  164. progname, strerror(errno), __func__);
  165. exit(EXIT_FAILURE);
  166. }
  167.  
  168. if ((mutex_girl = sem_open("/fmux", O_CREAT,
  169. 0644, 1)) == SEM_FAILED) {
  170. fprintf(stderr, "[%s]:[%s] - Cannot create semaphore femalemutex!\n",
  171. progname, strerror(errno), __func__);
  172. exit(EXIT_FAILURE);
  173. }
  174.  
  175. if ((new_person = sem_open("/new", O_CREAT,
  176. 0644, 1)) == SEM_FAILED) {
  177. fprintf(stderr, "[%s]:[%s] - Cannot create semaphore next!\n",
  178. progname, strerror(errno), __func__);
  179. exit(EXIT_FAILURE);
  180. }
  181.  
  182. if ((empty = sem_open("/free", O_CREAT,
  183. 0644, 1)) == SEM_FAILED) {
  184. fprintf(stderr, "[%s]:[%s] - Cannot create semaphore empty!\n",
  185. progname, strerror(errno), __func__);
  186. exit(EXIT_FAILURE);
  187. }
  188. }
  189.  
  190. void free_sem() {
  191. int err;
  192. err = sem_unlink("/m");
  193. /*if(err && errno != ENOSYS) {
  194. fprintf(stderr, "[%s]:[%s] - Cannot unlink semaphore: male %d \n",
  195. progname, strerror(errno), __func__, errno);
  196. exit(EXIT_FAILURE);
  197. }*/
  198.  
  199. err = sem_unlink("/f");
  200. /*if(err && errno != ENOENT) {
  201. fprintf(stderr, "[%s]:[%s] - Cannot unlink semaphore: female\n",
  202. progname, strerror(errno), __func__);
  203. exit(EXIT_FAILURE);
  204. }*/
  205.  
  206. err = sem_unlink("/mmux");
  207. /*if(err && errno != ENOENT) {
  208. fprintf(stderr, "[%s]:[%s] - Cannot unlink semaphore: malemutex\n",
  209. progname, strerror(errno), __func__);
  210. exit(EXIT_FAILURE);
  211. }*/
  212.  
  213. err = sem_unlink("/fmux");
  214. /*if(err && errno != ENOENT) {
  215. fprintf(stderr, "[%s]:[%s] - Cannot unlink semaphore: femalemutex\n",
  216. progname, strerror(errno), __func__);
  217. exit(EXIT_FAILURE);
  218. }*/
  219.  
  220. err = sem_unlink("/new");
  221. /*if(err && errno != ENOENT) {
  222. fprintf(stderr, "[%s]:[%s] - Cannot unlink semaphore: next\n",
  223. progname, strerror(errno), __func__);
  224. exit(EXIT_FAILURE);
  225. }*/
  226.  
  227. err = sem_unlink("/free");
  228. /*if(err && errno != ENOENT) {
  229. fprintf(stderr, "[%s]:[%s] - Cannot unlink semaphore: empty\n",
  230. progname, strerror(errno), __func__);
  231. exit(EXIT_FAILURE);
  232. }*/
  233. }
  234.  
  235. void finish() {
  236. int err;
  237.  
  238. join_threads(20);
  239.  
  240. err = sem_close(semaphore_m);
  241. if(err) {
  242. fprintf(stderr, "[%s]:[%s] - Cannot close semaphore: sem_m\n",
  243. progname, strerror(errno), __func__);
  244. exit(EXIT_FAILURE);
  245. }
  246.  
  247. err = sem_close(semaphore_f);
  248. if(err) {
  249. fprintf(stderr, "[%s]:[%s] - Cannot close semaphore: sem_f\n",
  250. progname, strerror(errno), __func__);
  251. exit(EXIT_FAILURE);
  252. }
  253.  
  254. err = sem_close(mutex_boy);
  255. if(err) {
  256. fprintf(stderr, "[%s]:[%s] - Cannot close semaphore: mutex_boy\n",
  257. progname, strerror(errno), __func__);
  258. exit(EXIT_FAILURE);
  259. }
  260.  
  261. err = sem_close(mutex_girl);
  262. if(err) {
  263. fprintf(stderr, "[%s]:[%s] - Cannot close semaphore: mutex_girl\n",
  264. progname, strerror(errno), __func__);
  265. exit(EXIT_FAILURE);
  266. }
  267.  
  268. err = sem_close(new_person);
  269. if(err) {
  270. fprintf(stderr, "[%s]:[%s] - Cannot close semaphore: new\n",
  271. progname, strerror(errno), __func__);
  272. exit(EXIT_FAILURE);
  273. }
  274.  
  275. err = sem_close(empty);
  276. if(err) {
  277. fprintf(stderr, "[%s]:[%s] - Cannot close semaphore: empty\n",
  278. progname, strerror(errno), __func__);
  279. exit(EXIT_FAILURE);
  280. }
  281.  
  282. free_sem();
  283. }
  284.  
  285.  
  286. int main() {
  287. srand((unsigned)time(NULL));
  288.  
  289. char humans[20];
  290.  
  291. free_sem();
  292. init_humans(humans);
  293. shuffle(humans, 20, sizeof(char));
  294.  
  295. mk_sem();
  296. mk_threads(humans, 20);
  297.  
  298. finish();
  299.  
  300. return 0;
  301. }
Advertisement
Add Comment
Please, Sign In to add comment